【发布时间】:2011-10-13 10:47:40
【问题描述】:
Rails 对原始 SQL 的抽象有时让我发狂。在 MySQL 中我可以这样做:
UPDATE FROM tasks AS t
LEFT JOIN projects as p
ON t.project_id = p.id
SET t.invoice_id = 7
WHERE p.organization_id == 42
AND t.invoice_id IS NULL
如何在 Rails 3.0.1 中通过预先加载来执行此操作?我已经尝试了以下所有方法:
Tasks.joins(:project).where('projects.organization_id' => 42, :invoice_id => nil).update_all( :invoice_id => 7 )
以及上述的所有变体。要么给出错误,要么什么也没找到。
然后我尝试使用scope:
Task.scope :find => {:joins => :project, :conditions => ["projects.organization_id == ? AND invoice_id IS NULL", @organization.id] } do
Task.update_all :invoice_id => @invoice.id
end
这个给了我错误undefined method 'to_sym' for #<Hash:0x1065c6438>。
我在这方面花费了太多时间,只是为了复制一个简单的 SQL 查询。请帮忙!
编辑:绕过 n+1 的临时错误解决方案:
task_ids = Task.select('tasks.id').joins(:project).where('projects.organization_id' => @organization.id, :invoice_id => nil).collect{|t| t.id}
Task.update_all ['invoice_id = ?', @invoice.id], ["id in (#{task_ids.join(',')})"]
【问题讨论】:
标签: sql ruby-on-rails ruby scope sql-update