has_many上的未定义方法:通过

时间:2012-07-23 04:31:16

标签: ruby-on-rails-3 activerecord has-many-through

我有三种模式:

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

无论出于何种原因,如果按标签获取项目,我都无法访问任务...     something = Tag.find(1).projects     something.tasks

...我收到错误:

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

我已经找了几个小时,找不到任何能解决这个问题的方法。基于我发现的一切,它应该起作用......但事实并非如此。

我正在使用Rails 3.2.3。

1 个答案:

答案 0 :(得分:1)

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

无论如何,您遇到的问题是您尝试从Relation对象而不是模型实例中检索关联。 Relations可用于链接查询条件,但不能直接引用它们的关联。所以,为了让你的例子有效,你需要做

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

然后参考这样的任务:p[0].tasks

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