Rails: связать модель с двумя в своем роде - PullRequest
1 голос
/ 12 марта 2010

я пытаюсь сделать это:

class Event < ActiveRecord::Base
  belongs_to :previous_event
  has_one :event, :as => :previous_event, :foreign_key => "previous_event_id"
  belongs_to :next_event
  has_one :event, :as => :next_event, :foreign_key => "next_event_id"
end

потому что я хочу, чтобы пользователь мог повторять события и изменять несколько встречных событий одновременно. что я делаю не так, или есть другой способ сделать это? как-то мне нужно знать о предыдущем и следующем событии, не так ли? когда я тестирую это в консоли с Event.all[1].previous_event, я получаю следующую ошибку:

NameError: uninitialized constant Event::PreviousEvent
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:105:in `const_missing'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2199:in `compute_type'
    from /Library/Ruby/Gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/kernel/reporting.rb:11:in `silence_warnings'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2195:in `compute_type'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/reflection.rb:156:in `send'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/reflection.rb:156:in `klass'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/belongs_to_association.rb:49:in `find_target'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_proxy.rb:239:in `load_target'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_proxy.rb:112:in `reload'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations.rb:1250:in `previous_event'
    from (irb):2

что здесь не так? Огромное спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 12 марта 2010

Он должен работать точно так же, нет необходимости в принадлежать_, так как он все равно круговой.

class Event < ActiveRecord::Base
  has_one :next_event, :class_name => "Event", :foreign_key => "previous_event_id"
  has_one :previous_event, :class_name => "Event", :foreign_key => "next_event_id"
end

Проблема здесь в том, что вы должны установить следующие и предыдущие события вручную. Вы можете просто создать next_event и посмотреть предыдущий (или наоборот - в зависимости от того, что более эффективно в вашем случае использования)

class Event < ActiveRecord::Base
  has_one :next_event, :class_name => "Event", :foreign_key => "previous_event_id"
  def previous_event
    Event.first(:conditions => ["next_event_id = ?", self.id])
  end
end
0 голосов
/ 12 марта 2010

Ах, только что нашел ошибку, это правильный способ сделать это:

class Event < ActiveRecord::Base
  belongs_to :previous_event,:class_name => "Event"
  has_one :event, :as => :previous_event, :class_name => "Event", :foreign_key => "previous_event_id"
  belongs_to :next_event,:class_name => "Event"
  has_one :event, :as => :next_event, :class_name => "Event", :foreign_key => "next_event_id"
end

нашел здесь

...