0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Rails]映画レビューサイトで各映画にジャンルをつけたい

Posted at

[自分用メモ]

各映画にジャンルが複数つくことがあるので、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です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?