困っていること
映画レビューサービスを作成しているのですが、
類似している映画を表示する機能を作成しているのですが、その設計に困っています。
ある映画(ボクシング映画A)とそれに類似した映画(ボクシング映画B)を紐づけてどちらの映画からも双方のレコードを取ってくるような設計がしたいと考えています。
データ構造
映画(movieモデル)は非常に単純なモデルで名前(name)のみを保持しています。
ruby
1create_table "movies", force: :cascade do |t| 2 t.string "name" 3end
類似映画を以下のように関連づけたいです。
考えたモデル
フォロー・フォロワーモデルのようなmovie_id
を別の外部keyで保持するようなモデルを考えてみました。
ruby
1 create_table "movie_relationships", force: :cascade do |t| 2 t.bigint "parent_movie_id", null: false 3 t.bigint "child_movie_id", null: false 4 t.datetime "created_at", null: false 5 t.datetime "updated_at", null: false 6 ... 7 end
ruby
1class Movie < ApplicationRecord 2... 3 4 def similar_movies 5 (parent_movies + child_movies).uniq 6 end 7end
問題点
カラムの名前への違和感
このモデルの問題として、親子関係ではなく、完全な兄弟関係にあるモデルなのでカラムの名前づけに非常に違和感を感じます。
重み付けがないのでどちらかに従属しているというような名前は避けたいです。
登録時の処理の問題
これらの関係の登録としてmovies/_form.html.haml
などで映画の編集時にmovie_relationships
のレコードを作成しようと考えましたが、レコードをチェックボックスで配列形式で送り, railsのcalllbackで処理するのは非常に辛いと思いました。
MovieRelationship
のafter_create
などで逆のレコードを作成できるのか?(無限ループになりそうなど。。)
このような自己結合かつ、フォロー・フォロワーのような方向付けがないモデルを開発をしたことがある方がいらしたらぜひ、アドバイスをいただければと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。