2011-06-28 32 views
6

मेरे पास एक सरणी में टिप्पणियों की सूची है। क्या मैं सरणी पर update_all का उपयोग कर सकता हूँ?क्या मैं सरणी पर update_all का उपयोग कर सकता हूं?

comments = Comments.find(:all,:conditions => ["test is not null"]) 

comments.update_all(:test => nil) 
+2

आप 'Comments.update_all (" test = NULL "का उपयोग कर सकते हैं," परीक्षण शून्य नहीं है ") 'इसके बजाय – bor1s

+3

मुझे यह वास्तव में जल्दी पूछने दें - क्या आपने इसे आजमाया है? इस तरह की चीज को आजमाने के लिए रेल कंसोल एक अच्छा टूल है। – pcg79

उत्तर

9

अगर आप स्कोप (find या all -इन Rails- के पुराने संस्करण एक सरणी लौट आए) के साथ काम आप कर सकते हैं:

comments = Comments.scoped(:conditions => "test IS NOT NULL") 
comments.update_all(:test => nil) 

रूबी/ActiveRecord के आधुनिक संस्करणों पर आप लिख सकते हैं:

Comments.where.not(test: nil).update_all(test: nil) 
3

update_all ActiveRecord द्वारा प्रदान की एक विधि है, और क्या आप किसी सरणी है, तो आप दो विकल्प हैं या तो टिप्पणी नहीं के माध्यम से ActiveRecord का उपयोग करें (डेटाबेस अद्यतन करेगा) या सरणी के नक्शे, स्मृति में और न केवल objets बदलते

comments = Comments.update_all({:test => nil}, 'test IS NOT NULL') 

या

comments = Comments.find(:all,:conditions => ["test is not null"]) 
comments.map! { |c| c.test = nil unless c.test} 

संपादित करें: दूसरे उदाहरण में त्रुटि, c.test नहीं ग

है डेटाबेस को संशोधित
+0

आपका दूसरा उदाहरण वास्तव में डेटाबेस में परिवर्तनों को सहेजता नहीं है (इसे 'c.save' या कुछ की आवश्यकता होगी), और आप पूरी टिप्पणी' nil' पर सेट कर रहे हैं, न केवल 'c.test'। –

+0

मैंने डेटाबेस में बदलावों को सहेजने के बारे में पूरी टिप्पणी सेट करने में समस्या को ठीक किया है, यह पहले से ही मेरे उत्तर के पाठ में था, सवाल यह नहीं कहता कि परिवर्तन डेटाबेस पर लागू किए जाने चाहिए या केवल सरणी ... यही कारण है कि मैंने दो समाधान दिए –

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