【问题标题】:Undefined Method on has_many :throughhas_many 上的未定义方法:通过
【发布时间】:2012-07-23 04:31:16
【问题描述】:

我有三个模型:

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。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    不过,我只需要确保 Tag.find(1).tasks 将生成相同的 SQL 并最终返回相同的 tasks 集合。

    【讨论】:

    • 对于你的问题,实际上它不会。无论项目如何,它都给了我所有标记的任务。我正在寻找作为每个项目的子集的任务,因此Tag.find(1).projects.tasks 尝试。我确实让它工作了,但我想你已经解释过了。我最初的方法是尝试同时为几个不同的项目获得结果。 p[0].tasks 可以让我得到我正在寻找的结果。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多