如何在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 }