MRからエンジニアへ

プログラミング初心者がご飯を食べれるようになるまで

【Rails】多対多のアソシエーション


初心者ということもあり、用語についても調べてアウトプットしていきます!

初心者の同志の方の勉強の一助になれれば幸いです♪

 

それでは頑張っていきましょう

 

多対多のアソシエーション

タスクにお気に入り機能を付けたい!
多対多のアソシエーションを実装していきます。

最初に完成形を示します。

user.rb

has_many :tasks, dependent: :destroy
has_many :favorites, dependent: :destroy
has_many :task_favorites, through: :favorites, source: :task

task.rb

has_many :favorites, dependent: :destroy
belongs_to :user

favorite.rb

belongs_to :user
belongs_to :task

初学者としてはtask_favorites?どこから来たの? って感じです。

task.rbとfavorite.rbはまあ分かるなって感じですね。 問題はuser.rbの部分です。

user.rb

has_many :tasks, dependent: :destroy
has_many :favorites, dependent: :destroy
has_many :task_favorites, through: :favorites, source: :task
has_many :task_favorites, through: :favorites, source: :task

のところ。本当は、has_many :tasks, through: :favoritesと書きたいのです。

しかし、

has_many :tasks, through: :favorites

と書いてしまうと、user.rbの一番上のhas_many :tasksと記載が同じになってしまいますよね。

同じになると何がいけないかって、

railsでは後に書いた方が上書きされてしまうからです。

例えば、current_user.tasks とかいても、favoriteしたtaskをとってきてしまいます。

違う名前を付けて、多対多のアソシエーションを実装していきます!