2017-01-19 78 views
5

price numaralı bir sütuna sahip bir modelim var. Varsayılan değer olarak price değerine sahip bir marked_price new_column eklemem gerekiyor. Bunu göçüme yazabilir miyim, yoksa bunu yapmanın en iyi yolu ne olabilir? gibiRayların taşınmasında yeni bir sütun için diğer sütunun değeri varsayılan değer olarak nasıl kopyalanır?

şey:

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

cevap

5

Hayır, veritabanı bir tablo sütun üzerinde DEFAULT ayarını kullanarak bunu yapmak için izin vermez.

Ama göç kendisine gelince

class MenuItem < ActiveRecord::Base 
    before_create :set_market_price_default 

    private 

    def set_market_price_default 
    self.market_price = self.price 
    end 
end 

bir ActiveRecord geri arama kullanarak bunu yapabilirsiniz, sen market_price elle

def change 
    add_column :menu_items, :marked_price, :decimal 

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

güncelleyebilir sana "fiyat" ve "marked_price" var düşünmek yanlış yol. Bu sözdizimi 'MenuItem.update_all (fiyat:: market_price)' çalışmıyor (en azından ActiveRecord 4.2.7.1'de) ve 'MenuItem.update_all (" marked_price = fiyat ") olmalıdır' ' –

+0

Ayrıca, 'update_all' Sadece göç ederken (aşağı değil) yürütülmelidir. Tüm sayılarda haklı bir "geri alınabilir" bloğu http://edgeguides.rubyonrails.org/active_record_migrations.html#using-reversible –

+1

@WizardofOgz ile sarılabilir. Cevabımı güncelledim. Teşekkür ederim. –