2012-03-01 12 views
5

यह अस्पष्ट रूप से संबंधित है: How to Update all Dates in a Table लेकिन केवल तभी यदि आप वास्तविक कड़ी मेहनत करते हैं।प्रति-रिकॉर्ड आधार पर तालिका में पहले से मौजूद डेटा का उपयोग करके रेल 3 अपडेट_ल

भाग 1 - मुझे पता है कि SQL एक सूत्र पर आधारित एक तालिका पर एक कॉलम अपडेट कर सकता है जिसमें उसी तालिका में अन्य कॉलम शामिल हैं। और यह एसक्यूएल का एक, आसान लाइन के साथ किया जा सकता है इस प्रकार है:

UPDATE thieving_prices SET current_price = (1 + usury_rate) * current_price; 

अब सभी की कीमतों सिर्फ अपने विभिन्न संबद्ध खलनायक दरों से बढ़ी किया गया है।

भाग 2 - मुझे यह भी पता है कि रेल 3 जादू का एक अद्भुत सा update_all जो एसक्यूएल की एक पंक्ति का उपयोग कर एक अद्यतन क्वेरी बनाता है कहा जाता है प्रदान करता है:

ThievingPrice.update_all(:current_price = 35000.00) 

उत्पन्न करता है:

UPDATE thieving_prices SET current_price = 35000.00; 

अब सभी कीमतें सभी उत्पादों के लिए समान हैं। इस चुस्त दुकान में बहुत बेकार।

भाग 3 - इन सभी कीमतों में वृद्धि की अपनी स्थिर दर है और इसे पूरा करने के लिए रेल 3 में कोड की एक सुंदर रेखा लिखने का एक तरीका होने के लिए कुछ भी है।

और लाइन:

ThievingPrice.update_all(:current_price => (1 + :usury_rate) * :current_price) 

काम नहीं करता। न ही किसी भी वाक्य रचनात्मक भिन्नता जिसमें ब्रांड्स, ब्रेसिज़ या ब्रैकेट शामिल हैं - जहां तक ​​मेरे प्रयोग दिखाए गए हैं। निश्चित रूप से दूसरों को इस तरह के निर्माण की जरूरत है। मैं अविश्वसनीय रूप से धीमी गति से और संसाधन-बर्बाद कर प्रत्येक ब्लॉक पर वापस गिर नहीं करना चाहती:

ThievingPrice.each do |tp| 
    new_price = tp.current_price * (1 + tp.usury_rate) 
    tp.update_attribute(:current_price => new_price) 
end 

समय है कि मेरी पीड़ितों संरक्षक दुकान छोड़ दिया है खत्म करके। मेरे विकल्प क्या हैं?

+0

क्या 'ThievingPrice.update_all (" current_price = (1 +?) * Current_price ",: usury_rate) 'विफल? – ScottJShea

+0

नहीं, यह स्ट्रिंग 'usury_rate' –

+0

द्वारा गुणा करने की कोशिश करता है, लेकिन, क्योंकि यह डेटाबेस पर संग्रहीत होने से पहले डेटा पर आधारित है, मैं सुरक्षित रूप से आपके सुझाव को अलग-अलग कर सकता हूं: ThievingPrice.update_all ("current_price = (1 + # {: usury_rate}) * current_price) और यह काम करता है। इसे मुझे अलग तरीके से देखने में मदद के लिए धन्यवाद। –

उत्तर

8

ThievingPrice.update_all("current_price = (1 + ?) * current_price" , :usury_rate) आज़माएं। इसे पैरामीटर लेना चाहिए और उस समय उस वस्तु द्वारा वर्तमान मूल्य को गुणा करना चाहिए जिस पर इस समय अपडेट की जा रही वस्तु के आधार पर।

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