ruby-on-rails-3 – Rails自我引用has_many通过自定义连接表命名
围绕以下情况我有些麻烦.
我正在尝试创建一个树结构,在那里我将能够为节点之间的连接提供自定义名称. 所以我想拥有Node和Relation模型.每 Node has_many :relations 每 Relation has_many :nodes 节点可以是父节点也可以是子节点.到目前为止,一切都很简单,并且有大量示例显示如何创建自引用的has_many表…问题是我希望能够为关系命名,以便我可以做类似的事情: relation1 = node1.relations.create(:name => "relation_name",:child => node2) 并在结果得到类似的东西: relation1.name == "relation_name" relation1.parent == node1 relation1.child == node2 所有的创作都发生在模型中,如果重要的话,这个活动并没有真正暴露给用户. EDIT2: class Node < ActiveRecord::Base belongs_to :sentence 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 has_many :relations,:foreign_key => "child_id" has_many :relations,:foreign_key => "parent_id" class Relation < ActiveRecord::Base has_many :videos,:as => :videoable,:dependent => :destroy has_many :phrases,:through => :videos belongs_to :parent,:class_name => "Node"#,:inverse_of => :parent_relation belongs_to :child,:inverse_of => :child_relation 解决方法
所以你所说的更像是
Joins Model而不是自我参考.
注意:我更改了您的关系协会“标签”,因为我的命名很难,因此您无需更改仅适合我的“标签”. 所以对于你的Node类,你可以做这样的事情 class Node < ActiveRecord::Base has_one :parent_relation,:class_name => "Relation" has_many :child_relations,:class_name => "Relation" has_one :parent,:through => :parent_relation has_many :children,:source => :child end 那么对于你的Relation类,你可以这样 class Relation < ActiveRecord::Base belongs_to :parent,:class_name => "Node",:inverse_of => :child_relations end ::inverse_of选项应该让你构建让你根据你的Node实例中的父和子关联构建一个Node,这只是一个神奇的警告:通过关系. (此文档位于Joins Model部分的底部.) 我不完全理解你的关联结构,但我认为这应该正确建模. Lemme知道是否有任何问题. 附注:由于Relation是ActiveRecord模块中设置的常量,因此您可以考虑将其更改为NodeRelationship.我不认为它会干扰你的程序,但它确实给我的思考过程带来了一些麻烦. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |