如何在Rails 4中迭代单行中的关系?

我有一个User模型has_many :tasks并希望做这样的事情:

  User.find([100,97]).tasks.each { |task| puts task.id } 

但这似乎不起作用。 我试过了

  User.find([100,97]).map(&:tasks).each { |task| puts task.id } User.find([100,97]).each.tasks.each { |task| puts task.id } 

这可能吗? 我该怎么办?

什么@lusketeer说,但加入是没有必要的:

 Task.where(user: [100, 97]).each { |task| puts task.id } 

它与你的第一个例子不兼容的原因是find方法返回一个数组,而不是ActiveRecord::Relation因此你不能在结果上链接任何更多的关系方法(例如, tasks )。

你的第二个例子,

 User.find([100,97]).map(&:tasks).each { |task| puts task.id } 

会工作,但不是你所期望的。 map(&:tasks)返回二维任务数组。 每个顶级元素都包含一个包含特定用户任务的数组。 要使此代码工作,您需要展平数组:

 User.find([100,97]).map(&:tasks).flatten.each { |task| puts task.id } 

虽然效率不高,但它会有效,因为它对每个用户的任务进行单独查询,使其成为N+1情况。

你最后一个例子,

 User.find([100,97]).each.tasks.each { |task| puts task.id } 

也可以使它工作,它只是一个语法问题:

 User.find([100,97]).each do |user| user.tasks.each { |task| puts task.id } end 

这也是N+1查询的情况,因此它并不完美。

像这样?

 Task.joins(:user).where("users.id" => [100, 97]).each { |task| puts task.id }