在我的Node
模型中,我有以下关联,其中两个nodes
在Link
模型中相关联:
has_many :first_links, class_name: "Link",
foreign_key: "first_node_id"
has_many :second_links, class_name: "Link",
foreign_key: "second_node_id"
belongs_to :organization
我基本上只希望拥有与节点关联的所有链接,无论该节点是first_node
还是second_node
。因此,我在Node
模型中也有以下方法:
def links
first_links + second_links
end
如果我现在在控制台中尝试Node.first.links
,那么它可以工作,我得到该节点的所有链接的列表,无论该节点是链接的第一个还是第二个节点。所以这种关系似乎有效。
在Organization
模型中我有:
has_many :nodes
has_many :links, through: :nodes, source: :links
但是,控制台中的Organization.first.links
会生成错误:
无法在模型中找到源关联“链接”或:链接 节点
我对through
协会做错了什么?
更新:我现在明白,我需要一种自定义方法来收集links
的所有organization
。以下内容对我来说最有意义(添加到Organization
模型中):
has_many :nodes
def links
nodes.each do |node|
self.links ||= [] #Create the array if it doesn't exist yet.
links << node.links.collect #Add all the links to the array.
end
end
如果我在控制台中尝试Organization.first.links
,则会产生以下错误。知道这个方法应该是什么样的吗?
/usr/local/rvm/gems/ruby-2.2.3/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:282:in“blame_file!”:无法修改冻结致命错误(RuntimeError) )
答案 0 :(得分:2)
嗯..
您只能拨打organization.nodes
而不是organization.links
,因为这只是Node
课程中的一种方法。
然而,您可以尝试在Organization
类中创建一个类似的方法(将是一个实例方法),以返回属于Organization
实例的所有节点的所有链接在其上调用新创建的方法。
例如:
def links
self.nodes.joins(:first_links) + self.nodes.joins(:second_links)
end