Я бы использовал Полиморфную ассоциацию:
# file: app/models/item.rb
class Item < ActiveRecord::Base
has_many :ratings, :as => :rateable
end
# file: app/models/user.rb
class User < ActiveRecord::Base
has_many :ratings
has_many :rated_items, :through => :ratings, :source => :rateable, :source_type => "Item"
end
# file: app/models/rating.rb
class Rating < ActiveRecord::Base
belongs_to :user
belongs_to :rateable, :polymorphic => true
validates_uniqueness_of :user_id, :scope => :rateable
end
При этом ваш пользователь может оценивать разные предметы, но только один раз за предмет.
Для реализации этого вам понадобятся поля rateable_id
и rateable_type
в таблице ratings
.Плюс, конечно, user_id
и rating_score
или что-то еще.
Большое преимущество заключается в том, что вы можете добавить столько rateables
, сколько пожелаете.Например, если вы хотите оценить модель Song
, вы можете просто реализовать ее следующим образом:
# file: app/models/song.rb
class Song < ActiveRecord::Base
has_many :ratings, :as => :rateable
end
Чтобы отобразить оценки для Item
: item.ratings
Чтобы отобразить все оцениваемые элементыUser
: user.rated_items
PS Я плохо разбираюсь в грамматике английского языка, так что поправьте меня, если ошиблись rateable
PPS, эта реализация не проверена, я написал это прямо из головы, поэтому нет гарантии, что он будет работать на 100%:)
Удачи!