[自分用メモ]
各映画にジャンルが複数つくことがあるので、moviesテーブルにgenreカラムを用意するのではなくgenresテーブルを作って外部キーとして反映する。
・一つの映画は複数のジャンル(例:コメディ、ホラー)と紐づく
・一つのジャンルは複数の映画と紐づく
中間テーブルを作成する必要がある。
必要なもの
・moviesテーブル
・genresテーブル
・上記2つの中間テーブル(ここではgenre_moviesテーブルとします)
上記3つのモデルをまず作ります。※movieモデルとコントローラーは既にある前提
genreモデルを作成してマイグレーションファイルを編集
20***_create_genre.rb
t.string :name
genre_movieモデルも作成します。
rails g model genre_movie
からのgenre_moviesテーブルを編集
20***create_genre_movies.rb
t.references :movie, foreign_key: true
t.references :genre, foreign_key: true
movie.rb
has_many :genre_movies
has_many :genres, through: :genre_movies
genre.rb
has_many :genre_movies
has_many :movies, through: :genre_movies
genre_movie.rb
belongs_to :movie
belongs_to :genre
movies_controller.rb
def show
@movie = Movie.find(params[:id])
(省略)
@genres = @movie.genres
end
movies/show.html
<p>ジャンル:
<% @movie.genres.each do |genre| %>
<%= genre.name %>
<% end %>
</p>
seed.rb
Genre.create!(
[
{
name:'サスペンス'
},
{
name:'ドラマ'
},
{
name:'ラブロマンス'
},
{
name:'コメディ'
}
]
)
// Movie.create!は書いてある
// Genre_movie.create!だとエラーになる
GenreMovie.create!(
[
{
movie_id: 1,
genre_id: 2
},
{
movie_id: 1,
genre_id: 4
},
{
movie_id: 2,
genre_id: 3
},
{
movie_id: 3,
genre_id: 1
},
{
movie_id: 4,
genre_id: 2
}
]
)
これで「ジャンル: ドラマ コメディ」みたいに反映されてればOKです。