Đã đến lúc Rails 'trừu tượng hóa từ SQL thô khiến tôi bị dơi. Trong MySQL, tôi có thể thực hiện điều này:Thực hiện update_all với các kết nối trong 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
Tôi có thể làm điều này trong Rails 3.0.1 với tải mong muốn như thế nào? Tôi đã thử tất cả những điều sau đây:
Tasks.joins(:project).where('projects.organization_id' => 42, :invoice_id => nil).update_all(:invoice_id => 7)
Và tất cả các biến thể ở trên. Tất cả đều đưa ra lỗi hoặc không tìm thấy bất cứ điều gì.
Sau đó, tôi cố gắng sử dụng 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
Cái này đã cho tôi lỗi undefined method 'to_sym' for #<Hash:0x1065c6438>
.
Tôi đã dành quá nhiều giờ cho việc này, chỉ để nhân rộng truy vấn SQL đơn giản. Hãy giúp tôi!
EDIT: giải pháp xấu tạm thời để có được xung quanh 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(',')})"]
Cảm ơn, Wayne. Tôi muốn trừu tượng nếu có thể bởi vì các hương vị khác nhau của SQL xử lý loại truy vấn này khá khác nhau và tôi lo lắng về việc nó sẽ phá vỡ trong tương lai. Ví dụ của tôi ở trên có thể được thay đổi để 'cập nhật nhiệm vụ, dự án thiết lập ...' và tôi vẫn còn gặp rắc rối. Nếu bạn có thêm suy nghĩ tôi sẽ đánh giá cao nó! – glortho
@Jed, Đó cũng sẽ là SQL không chuẩn. Tôi không biết Active Record sẽ trừu tượng ra sao. Một số điều bạn có thể làm với SQL không phù hợp với trừu tượng CRUD rất tốt. Điều này đặc biệt. –
Thú vị. Vì vậy, 1 + n (tải không mong muốn) thực sự là cách duy nhất để làm điều này trong lớp trừu tượng? Tôi không thể tin rằng 'phạm vi' không bằng cách nào đó đưa ra một giải pháp. Chẳng phải thứ gì đó giống như nỗ lực thứ hai của tôi ở trên công việc sao? Chỉ cần đi với 1 + n cho bây giờ nhưng chắc chắn không phải là một giải pháp bền vững. Cảm ơn sự giúp đỡ của bạn ... – glortho