私の最初の本能は結合テーブルを使用することですが、それが望ましくない場合は、User.movie[1-5]_id
列が法案に適合します。( movie1_id
Rails の慣例の方がmovie_id_1
.)
このRailsとActiveRecordにタグを付けたので、完全にテストされておらず、おそらく多少間違っているモデルコードを回答に追加します。:)
class User < ActiveRecord::Base
TOP_N_MOVIES = 5
(1..TOP_N_MOVIES).each { |n| belongs_to "movie#{n}".to_sym, :class_name => Movie }
end
その行をマクロ スタイルのメソッドでラップすることもできますが、それがアプリケーションの一般的なパターンでない限り、それを行うとおそらくコードが読みにくくなり、DRY のメリットはほとんどありません。
また、検証を追加して、ユーザーのリストに重複する映画がないことを確認することもできます。
ムービー クラスをユーザーに関連付ける方法も同様です。
class Movie < ActiveRecord::Base
(1..User::TOP_N_MOVIES).each do |n|
has_many "users_list_as_top_#{n}".to_sym, :class_name => User, :foreign_key => "movie#{n}_id"
end
def users_list_as_top_anything
ary = []
(1..User::TOP_N_MOVIES).each {|n| ary += self.send("users_list_as_top_#{n}") }
return ary
end
end
(もちろん、users_list_as_top_anything
明示的な SQL として書き出す方がよいでしょう。今日は怠け者です。)