It adlı defa katılır ile update_all yapmak. istekli yükleme ileham SQL Rails'in soyutlama bana kafayı sürücüler böyle Rails
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
nasıl Raylar 3.0.1 yapabilirsiniz: MySQL bunu yapabilir miydim? Aşağıdakilerin tümünü denedim:
Tasks.joins(:project).where('projects.organization_id' => 42, :invoice_id => nil).update_all(:invoice_id => 7)
Yukarıdakilerin tüm varyasyonları. Hepsi ya hata verdi ya da bir şey bulamadı.
Sonra scope
kullanmaya çalıştı:
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
Bu seferki bana hata undefined method 'to_sym' for #<Hash:0x1065c6438>
verdi.
Sadece basit bir SQL sorgusu çoğaltmak için, bu konuda yol çok uzun saatler geçirdim. Lütfen yardım et!
DÜZENLEME: Geçici kötü çözüm etrafında almak 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(',')})"]
Teşekkürler, Wayne. Mümkünse soyutlamak isterim çünkü SQL'in farklı tatları bu tür bir sorguyu oldukça farklı bir şekilde ele alıyor ve gelecekte kırılmasından endişeleniyorum. Yukarıdaki örneğim, "görevleri güncelleştir, proje ayarları ..." olarak değiştirilebilir ve hala sorun yaşıyorum. Başka düşüncelerin varsa, bunu takdir ediyorum! – glortho
@Jed, Bu da standart olmayan bir SQL olurdu. Active Record'un bunu nasıl soyutlatacağını bilmiyorum. SQL ile yapabileceğiniz bazı şeyler CRUD soyutlama ile çok iyi uyuşmuyor. Bu özellikle. –
İlginç. Yani 1 + n (istekli olmayan yükleme) soyutlama katmanında bunu yapmanın tek yolu gerçekten mi? Şüphem ki, 'bir şekilde bir çözüm sunmuyor. Yukarıdaki ikinci eforum gibi bir şey işe yaramaz mı? Şimdilik 1 + n ile gidiyor ama kesinlikle sürdürülebilir bir çözüm değil. Yardımınız için teşekkürler ... – glortho