2012-01-19 17 views
12

मेरे पास शिपमेंट नामक एक मॉडल है। मैंने शिपमेंट टेबल में कुछ कॉलम जोड़े और कुछ कॉलम हैं जिन्हें सहेजने से पहले गणना की जानी चाहिए। तो अब नए कॉलम की गणना करने और डेटा जोड़ने के लिए मुझे प्रत्येक रिकॉर्ड को संपादित करना और हिट अपडेट करना होगा।रेल 3. सभी रिकॉर्ड पर एक सेव एक्शन कैसे करें?

तो क्या सभी शिपमेंट रिकॉर्ड पर वैश्विक बचत करने का कोई तरीका है ताकि डेटा जोड़ा जा सके?

before_save :default_values 
    def default_values 
    self.volume = 1 unless self.volume 
    self.kilograms = 1 unless self.kilograms 
    self.status = "Open" if self.status.blank? 
     if self.mode == "Air" 
     self.estimated_transit_time = self.etd_origin + 7.days 
     self.eta_place_of_delivery = self.etd_origin + 7.days 
     else 
     self.estimated_transit_time = self.etd_origin + (Place.find_by_city(self.place_of_loading).transit_time).days 
     self.eta_place_of_delivery = self.etd_origin + (self.estimated_transit_time).days 
     end 
    end 

उत्तर

1

आप इस प्रकार का विधि बना सकते हैं:

def self.save_all 
    Shipment.all.each { |shipment| shipment.save! } 
end 

तो बस फोन:

Shipment.save_all 
+0

मैं 'मिल SystemStackError (ढेर स्तर बहुत गहरा):' लेकिन अगर मैं चलाने के 'Shipment.all.each {| लदान | shipment.save!} 'कंसोल में यह काम करता है। धन्यवाद! :) – leonel

13

बैच के द्वारा अपने डेटा लोड करें। कभी लोड सभी को एक बार

Shipment.find_each(:batch_size => 1000) do |shipment| 
    shipment.save! 
end 

तो फिर तुम एक प्रवास या कुछ और के बाद कुछ क्षेत्रों की गणना करने के लिए है जब। बस इस नौकरी को अपने माइग्रेशन पर जोड़ें।

+3

Model.all.each {| mdl | के बजाय बैचों का उपयोग करने का कारण साझा करने के लिए देखभाल करें। mld.save!}? –

+7

@ affinities23 बेशक! Model.all सभी रिकॉर्ड एक बार में लोड करेगा। यदि आपके पास रिकॉर्ड की थोड़ी सी मात्रा है, तो यह ठीक काम करेगा, लेकिन धीमे और धीमे हो जाएंगे और आखिरकार तोड़ जाएंगे यदि सभी रिकॉर्ड एक ही समय में स्मृति में फिट नहीं हो सकते हैं। find_each बैच द्वारा लोड होगा (मेरे उदाहरण में स्मृति में लोड 1000 से अधिक रिकॉर्ड नहीं) और इससे मैंने जो समस्या का वर्णन किया है उसे रोक देगा। – basgys

34

एक लाइनर:

Shipment.find_each(&:save) 
+9

ये सभी समाधान डेटाबेस में एन कॉल करते हैं। संग्रह अपडेट के लिए 'update_all' जैसे केवल 1 कॉल करना अधिक दिलचस्प होगा। –

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