Моим первым инстинктом было бы использовать объединяющую таблицу, но если это нежелательно, столбцы 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. Сегодня я ленивый.)