2010-03-29 6 views
-1

J'ai deux modèles:rails HABTM versus view (formtastic)

Le modèle NetworkObject essaie de décrire "hosts". Je veux avoir une règle avec la source et la destination, donc j'essaie d'utiliser les deux objets de la même classe car cela n'a pas de sens de créer deux classes différentes.

class NetworkObject < ActiveRecord::Base 
    attr_accessible :ip, :netmask, :name 
    has_many :statements 
    has_many :rules, :through =>:statements 
end 

class Rule < ActiveRecord::Base 
    attr_accessible :active, :destination_ids, :source_ids 
    has_many :statements 
    has_many :sources, :through=> :statements, :source=> :network_object 
    has_many :destinations, :through => :statements, :source=> :network_object 
end 

Pour construire le HABTM j'ai choisi le modèle JOIN. dans ce cas j'ai créé un modèle nommé Déclaration avec:

class Statement < ActiveRecord::Base 
    attr_accessible :source_id, :rule_id, :destination_id 
    belongs_to :network_object, :foreign_key => :source_id 
    belongs_to :network_object, :foreign_key => :destination_id 
    belongs_to :rule 
end 

Le problème est: est juste d'ajouter deux belongs_to à la même classe en utilisant différents FOREIGN_KEYS? J'ai essayé toutes les combinaisons comme:

belongs_to :sources, :class_name => :network_object, :foreign_key => :source_id 

mais pas de succès .. tout ce que je fais mal?

Répondre

1

Les associations doivent également connaître la clé étrangère à utiliser. Essayez de le mettre à jour. Je n'ai pas essayé cela, alors laissez-moi savoir si cela fonctionne ou non.

class Rule < ActiveRecord::Base 
    attr_accessible :active, :destination_ids, :source_ids 
    has_many :statements 
    has_many :sources, :through => :statements, :class_name => "NetworkObject", :foreign_key => "source_id" 
    has_many :destinations, :through => :statements, :class_name => "NetworkObject", :foreign_key => "destination_id" 
end 
+0

c'était l'un des mes essais. N'a pas fonctionné. Je pense que peut-être: source est un mot réservé .. de toute façon je l'ai réparé en créant deux modèles Dst et Src et puis je fais un héritage de NetworkObject. C'est de la saleté, mais ça a marché :-) –

Questions connexes