Два 1 - N отношения в Mongoid (Rails) - PullRequest
6 голосов
/ 18 июня 2011

Сценарий:

Как аккаунт может давать рейтинги другому аккаунту?Это приводит к двум спискам в учетной записи.Те, кого я оценил, и те, кто оценил меня.(my_ratings и Rating_given)

Это сводится к:

Как может работать несколько 1 - N отношений между одной и той же сущностью в Mongoid?

В Документах Mongoid написано, что вы можете использовать has_many и belongs_to для связывания сущностей.

У меня сейчас есть это на Account

  has_many :ratings, :as => "my_ratings"
  has_many :ratings, :as => "ratings_given"

и это на Рейтинги :

 belongs_to :user, :as => 'Rater'
 belongs_to :user, :as => 'Ratie'

Документы не охватывают этот случай, поэтому я подумал, что вам придется различать их с помощью параметра: as.

Правильно ли это даже удаленное взаимодействие?

1 Ответ

18 голосов
/ 18 июня 2011

Вы можете достичь желаемого, используя параметры class_name и inverse_of:

class Account
  include Mongoid::Document
  field :name
  has_many :ratings_given, :class_name => 'Ratings', :inverse_of => :rater
  has_many :my_ratings, :class_name => 'Ratings', :inverse_of => :ratee
end

class Ratings
  include Mongoid::Document
  field :name
  belongs_to :rater, :class_name => 'Account', :inverse_of => :ratings_given
  belongs_to :ratee, :class_name => 'Account', :inverse_of => :my_ratings
end

Документация изменилась с тех пор, как я в последний раз работал с ней, поэтому я не был уверен, что это все еще рекомендуемый подход. Похоже, он не упоминает эти опции на странице 1-многие ссылки . Но если вы посмотрите на общую страницу по отношениям , они там описаны.

В любом случае вам нужно явно связать ассоциации рейтинги_гивена / ратера и my_ratings / ratee, когда есть две ассоциации с одним и тем же классом, в противном случае mongoid не сможет узнать, какую из двух потенциальных инверсий выбрать.

...