何をしたか
Railsで多対多の関係もモデルがあった時に、レコード追加をどうできるのかが気になったため試しました。
今回の例
movie.rb
class Movie < ApplicationRecord
has_many :movie_tags
has_many :tags, through: :movie_tags
accepts_nested_attributes_for :tags
end
tag.rb
class Tag < ApplicationRecord
has_many :movie_tags
has_many :movies, through: :movie_tags
accepts_nested_attributes_for :movies
end
movie_tag.rb
class MovieTag < ApplicationRecord
belongs_to :movie
belongs_to :tag
end
レコード追加をしてみる
まずは既存のtagに紐づくmovieのレコードを追加したいと思います。
Tag.find_by(name: 'ジブリ').movies.create(title: 'もののけ姫')
Tag.find_by(name: 'ジブリ').movies.pluck(:title)
# => ['もののけ姫']
問題なくできました。
次はtagとそれに紐づくmovieを同時にレコードを追加してみます。
Tag.create(name: 'ピクサー', movies_attributes: [{title: 'カーズ'}, {title: 'トイ・ストーリー'}])
Tag.find_by(name: 'ピクサー').movies.pluck(:title)
# => ["カーズ", "トイ・ストーリー"]
こちらも問題なくできました。
もちろん逆にmovieとそれに紐づくtagを同時にレコードを追加する場合もできました。
Movie.create(title: '君の名は。', tags_attributes: [{name: '青春'}, {name: '新海'}])
Movie.find_by(title: '君の名は。').tags.pluck(:name)
# => ["青春", "新海"]
中間テーブルがあるのに、中間テーブルを意識せずにレコードを追加できるのでとても使いやすいなと思いました。
参考