2012-07-23 101 views
0

我有三个型号:未定义的方法:通过

Class Project < ActiveRecord::Base 
    has_many :tasks 
    has_many :tags, :through => :tasks 
end 

Class Tasks < ActiveRecord::Base 
    belongs_to :project 
    has_and_belongs_to_many :tags 
end 

Class Tags < ActiveRecord::Base 
    has_and_belongs_to_many :tasks 
    has_many :projects, :through => :tasks 

当我打开控制台,我可以让我的项目和任务信息,如预期:

Tag.find(1).projects 
Tag.find(1).tasks 

如果我想,我可以得到所有的任务,对每一个项目无论标签:

Project.find(1).tasks 

无论出于何种原因,如果我得到我无法访问任务通过标签项目... 东西= Tag.find(1).projects something.tasks

...我得到的错误:

undefined method `tasks' for #<ActiveRecord::Relation:0x007feae4af0e70> 

我已经找了几个小时,可以找不到解决这个问题的任何东西。基于我发现的一切,它应该工作......但事实并非如此。

我正在使用Rails 3.2.3。

回答

1

不应该Tag.find(1).tasks会给你同样的结果吗?

无论如何,您面临的问题是您试图从Relation对象中检索关联而不是模型的实例。 Relations可用于链接查询条件,但不能直接引用它们的关联。所以,让你的工作例如,你需要做的

p = Tag.find(1).projects.includes(:tasks) 

然后引用这样的任务:p[0].tasks

但是我只是确保Tag.find(1).tasks将生成相同的SQL,并最终返回相同的集合tasks

+0

对于你的问题,实际上它不会。它确实为我提供了所有标记的任务,无论项目如何。我正在寻找作为每个项目的子集的任务,因此'Tag.find(1).projects.tasks'尝试。 我只是让它工作,但我想你解释它。我最初的方法是试图同时获得几个不同项目的结果。 'p [0] .tasks'能够让我得到我期待的结果。 感谢您的帮助! – 2012-07-23 13:57:40