【问题标题】:Using includes with AREL functions将包含与 AREL 函数一起使用
【发布时间】:2013-04-13 10:43:52
【问题描述】:

我的应用程序中有以下类:

class Prompt
  has_many :entries
end

class Entry
  belongs_to :prompt
  belongs_to :user

  def self.approved
    where("is_approved")
  end
end

class User
  has_many :entries
end

我想显示给定提示的所有“已批准”条目的表格以及他们belong_to 的用户。要生成此列表,我执行以下查询:

prompt = Prompt.find(prompt_id, :include => {:entries => :user})

但是当我运行以下循环时,它会为每个用户进行查询,而不是使用预取的用户

prompt.entries.approved.each do |entry|
   puts entry.user.id
end

如何重写它,使其不会对循环的每次迭代进行查询?

【问题讨论】:

    标签: ruby-on-rails-3 arel


    【解决方案1】:

    它对每个用户进行查询,因为 entries.approved 正在为每个条目调用查询 *where('is_approved')*。您的 find 语句只是提取所有提示并创建可以访问其子属性的对象。我认为您需要的是一个 where 语句,该语句选择具有属性“is_approved”的所有条目,然后通过循环打印它们的 id。

    也许可以试试 @entries = Entry.where(is_approved: true).includes(entries: user) )

    然后

    entries.user.each 做 |user| 放用户.id 结束

    希望对你有帮助。

    【讨论】:

    • 有没有办法可以将approved 逻辑封装到一个函数中?另外,您将如何编写它,以便结果是一个 Prompt 对象,所有内容都急切地加载
    • 嗯,据我所知,belongs_to/has_many 不会急切加载相反的方式,但是使用 @entries = Entry.where(is_approved: true) 您应该能够访问急切加载的关联由 entry.prompt.each 提示做 |prompt|。对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多