En momentos como este, la abstracción de Rails a partir de SQL sin procesar me vuelve loco. En MySQL podría hacer esto:Realizando una actualización_toda con combinaciones en Rails
¿Cómo puedo hacer esto en Rails 3.0.1 con la carga ansiosa? He intentado todo lo siguiente:
Tasks.joins(:project).where('projects.organization_id' => 42, :invoice_id => nil).update_all(:invoice_id => 7)
Y todas las variaciones de las anteriores. Todos dieron errores o no encontraron nada.
Entonces traté de usar 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
Éste me dio el error undefined method 'to_sym' for #<Hash:0x1065c6438>
.
He pasado demasiadas horas en esto, solo para replicar una simple consulta SQL. ¡Por favor ayuda!
EDIT: mala solución temporal para moverse por 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(',')})"]
Gracias, Wayne. Me gustaría resumir si es posible porque los diferentes sabores de SQL manejan este tipo de consulta de forma muy diferente y me preocupa que se rompa en el futuro. Mi ejemplo anterior podría cambiarse a 'actualizar tareas, proyectos establecidos ...' y todavía tendría problemas. Si tienes más pensamientos, ¡te lo agradecería! – glortho
@Jed, Eso también sería SQL no estándar. No sé cómo Active Record lo resumiría. Algunas cosas que puede hacer con SQL no coinciden con la abstracción CRUD muy bien. Este especialmente. –
Interesante. Entonces, ¿1 + n (carga no ansiosa) realmente es la única forma de hacer esto en la capa de abstracción? No puedo creer que 'scope' no ofrezca de alguna manera una solución. ¿No debería funcionar algo como mi segundo esfuerzo anterior? Solo voy con 1 + n por ahora, pero definitivamente no es una solución sostenible. Gracias por su ayuda ... – glortho