I would use Polymorphic association:
# 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
With this your User can rate different Items, but only once per Item.
To implement this you'd need rateable_id
and rateable_type
fields in your ratings
table. Plus, off course, user_id
and rating_score
or something.
The great advantage is that you are able to add as much rateables
as you wish. If, for example, you want to rate a Song
model, then you can simply implement it like this:
# file: app/models/song.rb
class Song < ActiveRecord::Base
has_many :ratings, :as => :rateable
end
To show ratings for an Item
: item.ratings
To show all items rated by a User
: user.rated_items
P.S. I am not good in English grammar, so correct me if have misspelled rateable
P.P.S. this implementation is untested, I wrote it straight out of my head, so there's no guarantee it will work 100% :)
Good luck!