Ruby on Rails 3 - Новое в Rails - Понимание взаимосвязи для рейтинговых приложений - PullRequest
3 голосов
/ 19 апреля 2011

Я решил создать свой новейший сайт с использованием Rails 3. Это мой первый опыт работы с Rails и хотел узнать мнение сообщества о том, как сделать следующий сценарий.

У меня созданы следующие модели: Item, Rating, User

Я бы хотел, чтобы приложение работало как:

1) Item has many Ratings
2) User can submit many Ratings - Рейтинг прислал только один пользователь
3) Specific rating can can only have one Item and one User

Исходя из этого, я хочу иметь возможность:

1) Show all ratings for an item
2) Show all items rated by a particular user

Кажется, достаточно просто. Любая помощь или направление очень ценится.

1 Ответ

0 голосов
/ 19 апреля 2011

Я бы использовал Полиморфную ассоциацию:

# 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%:)

Удачи!

...