2011-02-06 15 views
74

किसी भी स्थिति को पूरा करने वाले सभी रिकॉर्ड के लिए "बड़े पैमाने पर अपडेट" करने का सबसे अच्छा तरीका है, रेलवे 3 में, सक्रियरेकॉर्ड का उपयोग करके, सेट करने के लिए एक एकल-क्वेरी तरीका है: फ़ील्ड को छुपाएं TRUE किसी शर्त को पूरा करने वाले सभी रिकॉर्ड के लिए ... उदाहरण के लिए, :condition => [ "phonenum = ?", some_phone_number ]रेल 3 + एक्टिव्रेकॉर्ड,

यदि कोई भी क्वेरी ऐसा नहीं कर सकती है, तो इष्टतम दृष्टिकोण क्या है?

उत्तर

84

हालत के लिए वैकल्पिक दूसरे पैरामीटर के साथ उपयोग update_all:

Model.update_all({ hidden: true }, { phonenum: some_phone_number}) 
+2

क्या इस मामले में जहां एक मूल्य के पूर्व update_all के लिए एक निश्चित मूल्य से कम है के बारे में ({: छिपा => true} {: date_created ctilley79

+7

@ ctilley79, मुझे लगता है कि यह काम करना चाहिए: 'Model.where (" date_create Dogbert

+0

नोट: यह 'counter_cache' को अपडेट नहीं करेगा। सावधान रहे। – sscirrus

84

update_all रेल में स्थिति 3. आप गुंजाइश के संयोजन का उपयोग करें और update_all की अनुमति नहीं देता

Model.where(phonenum: some_phone_number).update_all(hidden: true) 

संदर्भ: http://m.onkey.org/active-record-query-interface

+4

** यह गलत है **। पृष्ठ 'विकल्प किसी भी विकल्प की आपूर्ति ** **, विधि विकल्प के ऊपर पैराग्राफ के अनुसार' विकल्प 'हैश में जा सकने वाले विभिन्न विकल्पों का वर्णन करता है। इसमें 'update_all()' पर 'शर्तों' तर्क शामिल नहीं है। – Ashe

+0

मैं मानता हूं कि वह गलत है। एपीआई अवतार.अपडेट_ल ['migrated_at =?', time.now.utc], ['migrated_at>?', 1.week.ago] माइग्रेटेड = अब सेट करेगा जहां migrated_at एक सप्ताह के भीतर है। – ctilley79

+4

रेल के अनुसार 4 दस्तावेज, उपर्युक्त सुझाई गई विधि वास्तव में जाने का तरीका है - http://apidock.com/rails/ActiveRecord/Relation/update_all - # अपने शीर्षक पुस्तक में कहीं भी 'रेल' के साथ सभी पुस्तकें अपडेट करें। 'शीर्षक पसंद है?', '% रेल%')। update_all (लेखक: 'डेविड') –

4

यदि आप कॉलबैक ट्रिगर करना चाहते हैं:

class ActiveRecord::Base 
    def self.update_each(updates) 
    find_each { |model| model.update(updates) } 
    end 

    def self.update_each!(updates) 
    find_each { |model| model.update!(updates) } 
    end 
end 

तब:

Model.where(phonenum: some_phone_number).update_each(hidden: true)