Ruby on rails 3 上的未定义方法有多个:通过

Ruby on rails 3 上的未定义方法有多个:通过,ruby-on-rails-3,activerecord,has-many-through,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_b

我有三种型号:

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
如果需要,我可以获得每个项目的所有任务,而不考虑标记:

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

…我得到一个错误:

undefined method `tasks' for #<ActiveRecord::Relation:0x007feae4af0e70>
未定义的方法“任务”#
我找了几个小时,找不到任何可以解决这个问题的方法。根据我所发现的一切,它应该是有效的。。。但事实并非如此

我使用的是Rails 3.2.3。

不应该
标记.find(1)。任务
会给你同样的结果吗

无论如何,您所面临的问题是,您试图从
关系
对象而不是模型实例检索关联<代码>关系
可用于链接查询条件,但不能直接从中引用关联。所以,为了让你的例子发挥作用,你需要

p = Tag.find(1).projects.includes(:tasks)
然后引用如下任务:
p[0]。任务


但是,我要确保
标记.find(1).tasks
将生成相同的SQL,并最终将相同的
任务集合返回到您的问题,实际上不会。不管项目如何,它都会给我所有标记的任务。我将任务作为每个项目的一个子集进行查找,因此使用了
标记.find(1).projects.tasks
trunt。我只是让它工作,但我想你解释了。我最初的方法是尝试同时为几个不同的项目获得结果<代码>p[0]。任务
可以帮助我获得所需的结果。谢谢你的帮助!
p = Tag.find(1).projects.includes(:tasks)