То, о чем вы говорите, больше похоже на Соединение модели , чем на самообращение.
Примечание: я изменил ваши relation
ярлыки ассоциации, потому что мне было трудно с вашими именами, поэтому вам не нужно менять ваши ярлыки, которые были только для меня.
Так что для вашего Node
класса вы могли бы сделать что-то вроде этого
class Node < ActiveRecord::Base
has_one :parent_relation, :foreign_key => "child_id",
:class_name => "Relation"
has_many :child_relations, :foreign_key => "parent_id",
:class_name => "Relation"
has_one :parent, :through => :parent_relation
has_many :children, :through => :child_relations, :source => :child
end
Тогда для вашего Relation
класса вы могли бы что-то вроде
class Relation < ActiveRecord::Base
belongs_to :parent, :class_name => "Node", :inverse_of => :parent_relation
belongs_to :child, :class_name => "Node", :inverse_of => :child_relations
end
Опция :inverse_of
должна позволять вам строить, позволяя вам строить Node
на основе parent
и children
ассоциаций из ваших Node
экземпляров, это всего лишь предостережение от magic с :through
отношениями. (Документация по этому вопросу находится внизу раздела Joins Model .)
Я не совсем понимаю вашу структуру ассоциации, но я думаю, что это должно правильно ее смоделировать. Позвольте мне знать, если есть какие-либо проблемы.
Side Note: Поскольку Relation
является константой, установленной в модуле ActiveRecord
, вы можете подумать о том, чтобы изменить его на что-то вроде NodeRelationship
. Я не думаю, что это будет мешать вашей программе, но это определенно вызвало некоторые проблемы для моего мыслительного процесса.