Монгоидное самореференциальное соединение - PullRequest
1 голос
/ 06 декабря 2010

В настоящее время я работаю над небольшим приложением Rails 3, чтобы помочь отследить секретные Санты на работе.Я почти закончил и совершенно тупик, пытаясь разобраться с этой последней проблемой.

У меня есть документ Participant mongoid, который требует самостоятельного объединения, чтобы представлять, кто для кого должен покупать подарки.Неважно, что я делаю, я не могу заставить это работать.Мой код выглядит следующим образом:

# app/models/participant.rb
class Participant
include Mongoid::Document
include Mongoid::Timestamps

field :first_name, :type => String
field :last_name, :type => String
field :email, :type => String
# --snip--

referenced_in :secret_santa, :class_name => "Participant", :inverse_of => :receiver
references_one :receiver, :class_name => "Participant", :inverse_of => :secret_santa

Используя консоль rails, если я задаю какое-либо свойство, оно никогда не отражается на другой стороне объединения, а иногда теряется все вместе после сохранения и перезагрузки.Я уверен, что ответ мне бросается в глаза - но после нескольких часов пристального взгляда я все еще не вижу его.

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Просто чтобы быть в курсе событий, с mongoid 2+ вы можете находиться очень близко к ActiveRecord:

class Participant
   include Mongoid::Document
   has_one :secret_santa, :class_name => 'Participant', :inverse_of => :receiver
   belongs_to :receiver,  :class_name => 'Participant', :inverse_of => :secret_santa
end

HTH.

1 голос
/ 06 декабря 2010

Это немного сложно.Наличие самореференциальной связи «многие ко многим» на самом деле проще ( см. Мой ответ на этот вопрос ).

Я думаю, что это самый простой способ реализации самоссылочнойотношения один к одному.Я проверил это в консоли, и у меня это сработало:

class Participant
  include Mongoid::Document
  referenced_in :secret_santa,
                :class_name => 'Participant'

  # define our own methods instead of using references_one
  def receiver
    self.class.where(:secret_santa_id => self.id).first
  end

  def receiver=(some_participant)
    some_participant.update_attributes(:secret_santa_id => self.id)
  end      
end

al  = Participant.create
ed  = Participant.create
gus = Participant.create

al.secret_santa = ed
al.save
ed.receiver == al         # => true

al.receiver = gus
al.save
gus.secret_santa == al    # => true
...