2013-10-18 10 views
8

मैं कुछ रिकॉर्ड के लिए updated_at अपडेट करना चाहते हैं:ActiveRecord में एकाधिक रिकॉर्ड कैसे स्पर्श करें?

users = User.in_mailing_list 
users.update_all(:updated_at => Time.now) 

वहाँ इस प्रयोजन के लिए एक शॉर्टकट है, का कहना है कि एक users.touch_all विधि की तरह कुछ?

+0

मुझे कोई कारण नहीं दिख रहा है कि आप 'ActiveRecord :: Base' को जो भी उपयोगिता विधियों को – synapse

+0

@synapse पसंद नहीं करते हैं, एक पहिया को पुनर्निर्मित करने से बचें। – ohho

उत्तर

0

यह करना चाहिए:

User.update(users, :updated_at => Time.now) 
5

सुनिश्चित नहीं हैं कि अगर rhernando के जवाब रूबी के पुराने संस्करणों में काम करता है, लेकिन यह मेरी राय में एक बहुत स्पष्ट तरीका है और रूबी में 2+

users.each(&:touch) 
काम करता है
  • एनबी। जैसा कि टिप्पणियों में उल्लिखित है, यह एन_ अनुरोधों का उपयोग करेगा जो update_all का उपयोग करने के विरोध में है जो इसे एक ही कमांड में करेगा।
+5

यह अनावश्यक रूप से _n_ प्रश्न जारी करेगा। 'users.update_all अपडेट_एट: टाइम.now' 1 क्वेरी के साथ करता है। –

+1

यदि आप कॉलबैक को स्पर्श पर आग लगाना चाहते हैं तो यह आवश्यक है। Update_all के लिए एपीआई डॉको: "यह शामिल मॉडलों को तुरंत चालू नहीं करता है और यह सक्रिय रिकॉर्ड कॉलबैक या सत्यापन को ट्रिगर नहीं करता है।" –

+2

@ लुकास नेल्सन 'टच' उन्हें या तो ट्रिगर नहीं करेगा। दस्तावेज़ों के अनुसार: 'कोई सत्यापन नहीं किया जाता है और केवल बाद के बाद, बाद_commit और after_rollback कॉलबैक निष्पादित किए जाते हैं।' Ref: http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-touch – vedant1811

4

आप इस तरह यह कर सकते हैं:

User.update_all({updated_at: Time.now}, {id: user_ids}) 

नोट: ब्रेसिज़ के लिए आवश्यक हैं, अन्यथा यह, updated_atऔरid सेट करने का प्रयास करने के बजाय updated_atजहांid user_ids

में है अद्यतन करने का

चीयर्स!

+4

यह हो सकता है 'user.where (id: user_ids) के रूप में भी लिखा जा सकता है .update_all (update_at: time.now) ' – JackCollins

+0

बहुत उपयोगी, जब आप कई मॉडलों के लिए थोक अपडेट कर रहे हैं और अपडेट_ट टाइमस्टैम्प सेट करना ट्रिगर करना चाहते हैं! धन्यवाद! –

1

यदि आपको ActibeRelaton रिकॉर्ड्स की आवश्यकता है तो आपको update_all विधि का उपयोग करना होगा। यह कई यह रिकॉर्ड को छू लेती है एकल लेन-देन:

User.update_all(updated_at: Time.current) 
User.where(active: true).update_all(active: false) 

लेकिन अगर आप रिकॉर्ड की Array है, इस मामले में, आप केवल eachupdate

users.each { |user| update(activ: true) } 

इस मामले का नुकसान के साथ उपयोग करें: प्रत्येक user के लिए होगा अलग लेनदेन

संबंधित मुद्दे