Выполнение update_all с объединениями в Rails

В такие моменты абстракция 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 метод 'to_sym' для # .

Я потратил на это слишком много часов, просто чтобы воспроизвести простой 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(',')})"]

11
задан Juan Mellado 4 May 2012 в 13:38
поделиться