2010-03-11 9 views
1

im essayant de le faire:Rails: modèle associé avec deux de son genre

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 

parce que je veux permettre à l'utilisateur de répéter les événements et changer plusieurs événements venant en sens inverse en même temps. qu'est-ce que je fais de mal, ou y a-t-il une autre façon de faire cela? en quelque sorte, j'ai besoin de savoir sur l'événement précédent et le prochain, n'est-ce pas? quand je teste cela dans le consolewith Event.all[1].previous_event, je reçois l'erreur suivante:

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 

ce qui se passe mal ici? Merci beaucoup pour votre aide.

Répondre

0

Il devrait fonctionner comme ça, il n'y a pas besoin de l'belongs_to puisqu'il circulaire de toute façon. Cependant, le problème ici est que vous devez définir manuellement les événements suivants et les événements précédents. Vous pourriez juste avoir un next_event et chercher le précédent (ou vice versa - selon lequel est plus efficace dans votre cas d'utilisation)

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

vous avez raison, je n'aurai probablement même pas besoin de la référence à la événement précédent. et ça marche très bien sans le belongs_to! Merci –

0

Ah, juste trouvé l'erreur, c'est la bonne façon de le faire:

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 

trouvé ce here