I've decided to build my newest site using Rails 3. This is my first experience with Rails and wanted to get the communities opinion on how to do the following scenario.
I have the following models created: Item, Rating, User
I would like the app to work as:
开发者_运维问答1) Item has many Ratings
User can submit many Ratings
- Only one user submitted rating per item
3) Specific rating can can only have one Item and one User
Based on this I want to be able to:
1) Show all ratings for an item
Show all items rated by a particular user
Seems simple enough. Any help or direction is appreciated greatly.
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!
精彩评论