[Rails] Mysql2::Error:Unknown column(팔로우 기능)

소개



이 기사에서는 팔로우 기능 도입 중에 발생한 오류
내가 한 해결책을 설명합니다.
어제도 팔로우 기능을 구현하고 드디어 끝 같은 느낌입니다.
마지막 기사입니다.

오류 내용



ActiveRecord::StatementInvalid in ~
Mysql2::Error:Unknown column 'relationships.user_id' in 'where clause'
라는 오류가 발생했습니다.
clause=句라는 의미인 것 같습니다. (Google 선생님)



내용으로서는 'relationships.user_id'라는 컬럼은 모른다.
라고 말합니다.

? ?

코드



routes.rb
Rails.application.routes.draw do

  devise_for :users
  root to: 'foods#index'
  resources :foods do
    collection do
      get :search
    end
    resource :likes, only: [:create, :destroy]
  end
  resources :users do
    resources :relationships, only: [:create, :destroy]
    get :followings, on: :member
    get :followers, on: :member
  end
end

팔로우 기능이므로 User 모델

user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :foods, dependent: :destroy
  has_many :likes, dependent: :destroy
  has_many :liked_foods, through: :likes, source: :food

  has_many :relationships
  has_many :followings, through: :relationships, source: :follower
  has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: :follower_id
  has_many :followers, through: :reverse_of_relationships, source: :following


  has_one_attached :image

  def already_liked?(food)
    self.likes.exists?(food_id: food)
  end

  def is_followed_by?(user)
    reverse_of_relationships.find_by(following_id: user.id).present?
  end

end
該当箇所のみ

<div class="mypage-follow-info">
  <h2 class="mypage-follow">フォロー</h2>
    <%= link_to @user.followings.count, followings_user_path(@user) %>
  <h2 class="mypage-follow">フォロワー</h2>
    <%= link_to @user.followers.count, followers_user_path(@user) %>
</div>

원인 규명



잘 모르기 때문에, 우선, 분노하고 있는 곳을 통째로 지워 보았습니다.
コメントアウトしてみた
<div class="mypage-follow-info">
  <h2 class="mypage-follow">フォロー</h2>
    <%#= link_to @user.followings.count, followings_user_path(@user) %>
  <h2 class="mypage-follow">フォロワー</h2>
    <%= link_to @user.followers.count, followers_user_path(@user) %>
</div>

그러자 브라우저가 코멘트 아웃했을 때 뽑아 무사히 표시되었습니다.
<%= link_to @user.followers.count, followers_user_path(@user) %>

여기가 표시되었으므로,
원인은
<%= link_to @user.followings.count, followings_user_path(@user) %>

이라는 것이 판명.

형태는 followers 에서는 문제 없었기 때문에,
모델이나 컨트롤러가 아닌지 찾았습니다.

결과



모델이었습니다.

user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :foods, dependent: :destroy
  has_many :likes, dependent: :destroy
  has_many :liked_foods, through: :likes, source: :food

  has_many :relationships ←ここ!!
  has_many :followings, through: :relationships, source: :follower
  has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: :follower_id
  has_many :followers, through: :reverse_of_relationships, source: :following


  has_one_attached :image

  def already_liked?(food)
    self.likes.exists?(food_id: food)
  end

  def is_followed_by?(user)
    reverse_of_relationships.find_by(following_id: user.id).present?
  end

end

user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :foods, dependent: :destroy
  has_many :likes, dependent: :destroy
  has_many :liked_foods, through: :likes, source: :food

  has_many :relationships, foreign_key: :following_id
  has_many :followings, through: :relationships, source: :follower
  has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: :follower_id
  has_many :followers, through: :reverse_of_relationships, source: :following


  has_one_attached :image

  def already_liked?(food)
    self.likes.exists?(food_id: food)
  end

  def is_followed_by?(user)
    reverse_of_relationships.find_by(following_id: user.id).present?
  end

end
has_many :relationships
foreign_key: :following_id 를 작성할 수 없습니다.

외래 키 (foreign key)
【SQL 입문】외부 키란? 기본 키와의 관계 및 작성 방법에 대해 설명

외래 키 (FOREIGN KEY)는
관련 테이블간을 연결하기 위해 설정하는 열로 데이터의 무결성을 데이터베이스에 보증시키기 위해서 이용합니다.

설정을 잊었기 때문에 following이 공중에 떠 있던 느낌 이군요.

끝에



원래 앱에서 Docker를 다루고 싶었기 때문에,
Docker 학습을 시작했습니다.
조금 어렵고 머리가 혼란 스럽지만,仮想 라는 말을 좋아하고 흥미는 끓고 있습니다.
YouTube에서 이 사람과 같은 일을 했습니다.
좋으면 봐주세요.
Docker 초입문 강좌 합병판 | 처음부터 실천하는 4시간의 풀코스

이번 참고 기사입니다.
Mysql2::Error: Unknown column 'favorites.true' in 'where clause' 해결 방법

내일은 일요일이지만,
계속해서 Docker의 학습도 노력합니다!
어딘가의 타이밍에 Docker의 기사도 쓰고 싶다!

좋은 웹페이지 즐겨찾기