यह बार मिलती है के साथ एक update_all कर। 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
मैं रेल लोड 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 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(',')})"]
धन्यवाद, वेन। यदि संभव हो तो मैं सारण करना चाहता हूं क्योंकि एसक्यूएल के विभिन्न स्वाद इस प्रकार की क्वेरी को काफी अलग तरीके से संभालते हैं और मैं भविष्य में इसे तोड़ने के बारे में चिंतित हूं। ऊपर मेरा उदाहरण 'अपडेट कार्यों, परियोजनाओं सेट ...' में बदल दिया जा सकता है और मुझे अभी भी परेशानी होगी। यदि आपके पास और विचार हैं तो मैं इसकी सराहना करता हूं! – glortho
@ जेड, यह गैर मानक एसक्यूएल भी होगा। मुझे नहीं पता कि सक्रिय रिकॉर्ड कैसे अमूर्त होगा। एसक्यूएल के साथ आप कुछ चीजें कर सकते हैं जो सीआरयूडी अबास्ट्रक्शन से बहुत अच्छी तरह से मेल नहीं खाते हैं। यह विशेष रूप से। –
दिलचस्प। तो 1 + एन (गैर-उत्सुक लोडिंग) वास्तव में अबास्ट्रक्शन परत में ऐसा करने का एकमात्र तरीका है? मैं विश्वास नहीं कर सकता कि 'स्कोप' किसी भी तरह से समाधान प्रदान नहीं करता है। काम से ऊपर मेरे दूसरे प्रयास की तरह कुछ नहीं होना चाहिए? अभी के लिए सिर्फ 1 + एन के साथ जा रहा है लेकिन निश्चित रूप से एक स्थायी समाधान नहीं है। आपकी मदद के लिए धन्यवाद ... – glortho