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)