Rails의 원시 SQL에서 추상화 된 기능을 사용하면 시간이 많이 걸립니다. 열망 로딩Rails에서 조인을 사용하여 update_all 수행
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
어떻게 레일 3.0.1에서이 작업을 수행 할 수 있습니다 : MySQL의에서 나는이 작업을 수행 할 수 있습니까? 나는 다음을 모두 시도했다 :
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(',')})"]
Thanks, Wayne. 가능하다면 SQL의 다른 맛은 이런 종류의 쿼리를 상당히 다르게 처리하기 때문에 추상적으로하고 싶습니다. 위의 예제는'update tasks, projects set ... '로 바뀔 수 있으며 여전히 문제가있을 것입니다. 너 더 생각이 있다면 나는 그것을 고맙게 생각할 것이다! – glortho
@Jed, 그것은 비표준 SQL이기도합니다. 액티브 레코드가 그것을 어떻게 추상화할지 모르겠습니다. SQL로 할 수있는 일 중 일부는 CRUD 추상화와 잘 일치하지 않습니다. 이것은 특히. –
흥미 롭습니다. 그래서 1 + n (비 열심히 로딩)은 추상화 계층에서 이것을 수행하는 유일한 방법입니다. 나는 '범위'가 어떻게 든 해결책을 제시하지 않는다고 믿을 수 없다. 일하는 내 두 번째 노력과 같은 것이 아니겠습니까? 이제는 1 + n으로 진행하지만 지속 가능한 솔루션은 아닙니다. 도와 주셔서 감사합니다 ... – glortho