2010-03-29 2 views
-1

У меня есть две модели:рельсы HABTM против вида (formtastic)

Модель NetworkObject пытается описать «хосты». Я хочу иметь правило с источником и адресом назначения, поэтому я пытаюсь использовать оба объекта из того же класса, так как не имеет смысла создавать два разных класса.

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 

Чтобы построить HABTM, я выбрал модель JOIN. поэтому в данном случае я создал модель с именем Statement с:

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 

Проблема состоит в следующем: право добавлять два belongs_to к тому же классу, используя различные foreign_keys? Я пробовал все комбинации, такие как:

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

но без успеха .. все, что я делаю не так?

ответ

1

Ассоциации также должны знать, какой внешний ключ использовать. Попробуйте обновить его до этого. Я не пробовал это, поэтому дайте мне знать, работает ли это или нет.

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

Это была одна из моих попыток. Не работает. Я думаю, может быть: источник - это зарезервированное слово. В любом случае я исправил его, создав две модели Dst и Src, а затем сделаю наследие из NetworkObject. Это грязь, но работало :-) –

Смежные вопросы