Has_many通过协会不工作

时间:2016-01-15 21:08:47

标签: ruby-on-rails ruby ruby-on-rails-4 model associations

在我的Node模型中,我有以下关联,其中两个nodesLink模型中相关联:

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) )

1 个答案:

答案 0 :(得分:2)

嗯..

您只能拨打organization.nodes而不是organization.links,因为这只是Node课程中的一种方法。

然而,您可以尝试在Organization类中创建一个类似的方法(将是一个实例方法),以返回属于Organization实例的所有节点的所有链接在其上调用新创建的方法。

例如:

def links
  self.nodes.joins(:first_links) + self.nodes.joins(:second_links)
end