2012-02-01 6 views
6

मैं update_all का उपयोग करने में फ़ील्ड को अपडेट करने का प्रयास कर रहा हूं। हालांकि मुझे किसी अन्य क्षेत्र से लिया जाने वाला मूल्य चाहिए जो मेरे विशिष्ट प्रारूप में फिर से लिखा गया है।किसी अन्य कॉलम से मूल्य वाले फ़ील्ड्स को अपडेट करने के लिए Rails update_all विधि का उपयोग

अगर मैं अपने मॉडल में कुछ इस तरह है:

def self.clean_mac_address() 
    clean_mac_address = :macaddress.gsub(/[^0-9a-z]/i, '') 
end 

जब मैं इस चलाएँ:

Radacct.update_all("mac_clean = #{clean_mac_address}") 

मैं एक त्रुटि मिलती है:

NoMethodError: undefined method `gsub' for :macaddress:Symbol 

किसी भी विचार कैसे मैं कर सकते हैं यह करो? या क्षेत्र को अद्यतन करने का एक आसान तरीका है?

+1

मुझे शक है अगर आप 'एक' symbol' पर gsub' विधि का उपयोग कर सकते हैं। हो सकता है कि आपको त्रुटि मिल रही हो। – uday

+1

सबसे पहले, आप प्रतीक पर 'gsub' क्यों कॉल कर रहे हैं? दूसरा, अगर मैं सही ढंग से समझता हूं तो आप प्रत्येक रिकॉर्ड के लिए अन्य कॉलम के आधार पर 'mac_clean' कॉलम की गणना और भरना चाहते हैं। उस स्थिति में आप केवल 'update_all' का उपयोग कर सकते हैं यदि आप एसक्यूएल में सभी मैनिपुलेशन करते हैं तो' update_all' आपके द्वारा रिकॉर्ड किए गए अपडेट को सभी रिकॉर्ड पर स्ट्रिंग के रूप में चलाएगा, लेकिन यह उन्हें डीबी से लोड नहीं करेगा और ' मॉडल उदाहरण शुरू नहीं करते हैं। इसका मतलब है कि आप SQL क्वेरी से निपट रहे हैं और 'ActiveRecord' विशेषताओं तक सीधे पहुंच नहीं है। –

+0

@ केएल 7: मैकड्रेस को प्रतीक नहीं माना जाता है - यह एक स्ट्रिंग होना चाहिए। तो, मुझे प्रत्येक रिकॉर्ड और अद्यतन के माध्यम से लूप को कुछ लिखना है ?? थोड़ा उलझन में हूँ। – simonmorley

उत्तर

11

update_all चलाने के लिए एक एकल SQL क्वेरी उत्पन्न करता है - यह चालाकी की तरह मनमानी बिट्स को समकक्ष एसक्यूएल में परिवर्तित नहीं कर सकता है।

आप या तो आप सभी उदाहरणों उदाहरण

Foo.find_each do |foo| 
    # update foo here 
    foo.save! 
end  

के लिए, (उदाहरण के लिए find_each के माध्यम से) लोड और उन्हें एक एक करके ठीक कर (यानी update_all का उपयोग नहीं करते) या कि सफाई व्यक्त करने का एक तरीका खोजने की जरूरत है एसक्यूएल में ऑपरेशन। उदाहरण के लिए Postgres एक regexp_replace समारोह

Foo.update_all("some_column = regexp_replace(some_column, 'your_regexp_here', '','g')") 

कौन सा सब कुछ है कि regexp जगह हटा है। जाहिर है आपको यह देखने के लिए कि क्या यह ऐसी सुविधा का समर्थन करता है, आपको अपने डेटाबेस के लिए प्रलेखन की जांच करनी होगी।

+0

क्या मुझे रिकॉर्ड ए खोजने, मूल्य बदलने, इत्यादि इत्यादि खोजने के लिए इसे लूप में चिपकाने की ज़रूरत है ?? क्या आप कुछ कोड साझा कर सकते हैं? एस – simonmorley

+0

इस बात पर निर्भर करता है कि आपने किन तरीकों से सुझाव दिया है कि आप –

+0

चुनते हैं ठीक है, बीमार देखो। MySQL पर हूँ। एस – simonmorley

0

जबकि स्वीकार किए जाते हैं जवाब update_all के लिए एक अच्छा तरीका प्रदान करता है, जो मैं प्रयोग करेंगे

read_with_clean_addr = Radacct.where(mac_clean: :macaddress.gsub(/[^0-9a-z]/i, '')) 
read_with_clean_add.update_all(mac_clean: "#{clean_mac_address}") 
संबंधित मुद्दे