使用包含AREL功能

时间:2013-04-19 23:15:14

标签: ruby-on-rails-3 arel

我的申请中有以下课程:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

然后

entries.user.each do | user |    put user.id 端

希望这有帮助。