2017-01-19 14 views
5

मेरे पास एक कॉलम price वाला मॉडल है। मुझे price का मान डिफ़ॉल्ट मान के रूप में एक नया_column marked_price जोड़ने की आवश्यकता है। क्या मैं इसे अपने प्रवासन में लिख सकता हूं, या ऐसा करने का सबसे अच्छा तरीका क्या हो सकता है?रेल प्रवासन में नए कॉलम के लिए अन्य कॉलम के मान को डिफ़ॉल्ट मान के रूप में कैसे कॉपी करें?

कुछ की तरह:

class AddMarkedPriceToMenuItems < ActiveRecord::Migration 
    def change 
    add_column :menu_items, :marked_price, :decimal, :default => :price 
    end 
end 

उत्तर

5

नहीं है, डेटाबेस आप तालिका कॉलम पर DEFAULT सेटिंग का उपयोग कर ऐसा करने की अनुमति नहीं देता है।

लेकिन आप एक ActiveRecord कॉलबैक

class MenuItem < ActiveRecord::Base 
    before_create :set_market_price_default 

    private 

    def set_market_price_default 
    self.market_price = self.price 
    end 
end 

प्रवास खुद के लिए के रूप में उपयोग करते हुए यह कर सकते हैं, तो आप market_price मैन्युअल

def change 
    add_column :menu_items, :marked_price, :decimal 

    reversible do |dir| 
    dir.up { MenuItem.update_all('marked_price = price') } 
    end 
end 
+0

अद्यतन कर सकते हैं मुझे लगता है कि आप "कीमत" और "marked_price" मिल गया गलत रास्ता। यह वाक्यविन्यास 'MenuItem.update_all (मूल्य:: market_price)' काम नहीं करता है (कम से कम ActiveRecord 4.2.7.1 पर) और 'MenuItem.update_all ("mark_price = price") होना चाहिए' –

+0

इसके अलावा, 'update_all' माइग्रेट करते समय केवल नीचे नहीं किया जाना चाहिए (नीचे नहीं)। इसे 'रिवर्सिबल' ब्लॉक http://edgeguides.rubyonrails.org/active_record_migrations.html#using-reversible –

+1

@WizardofOgz में लपेटा जा सकता है, आप सभी गिनती पर सही हैं। मैंने अपना जवाब अपडेट कर लिया है। धन्यवाद। –

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