2010-04-11 38 views
15

Komisyon geçiş dosyasında kullanılacak özel bir veri türünü nasıl oluşturabileceğimi merak ediyorum. Örnek: Bir model oluşturuyorsanız, taşıma dosyasında sütunlar ekleyebilirsiniz. Bu gibi görünebilir:Raylar: özel bir veri türü oluşturma/kısa yol oluşturma

def self.up 
    create_table :products do |t| 
     t.column :name, :string 
     t.timestamps 
    end 
    end 
Böyle bir şey nasıl oluşturulacağını bilmek istiyorum

:

t.column :name, :my_custom_data_type 

başka bir şey değildir örneğin bir "para birimi" türünü oluşturmak için Bunun nedeni, 8'lik bir doğrulukla bir ondalıktan ve 2'lik bir ölçekden daha fazla. Sadece MySQL kullandığım için, bu veritabanı için çözüm yeterlidir.

Geri bildiriminiz ve yorumlarınız için teşekkür ederiz!

+0

Para birimi için kayan nokta veri türlerini kullanmak genellikle korkunç bir fikirdir. –

+0

Daha iyi bir çözümünüz varsa, lütfen ayrıntılandırın. – Shyam

+1

Para gem, http://money.rubyforge.org/ gibi bir şey kullanın. – theIV

cevap

21

Yapmak istediğiniz şey, özel türünüzü oluşturmak için seçenekler sağlayan yeni bir sütun oluşturma yöntemi tanımlamaktır. Esas olarak, geçişlerde t.integer ... gibi davranan bir yöntem ekleyerek yapılır. Hile, bu kodu nereye ekleyeceğimizi bulmaktır. senin initializers dizin yerin Bu kod ön içinde

bazıları:

module ActiveRecord::ConnectionAdapters 
    class TableDefinition 
    def currency (*args) 
     options = args.extract_options! 
     column_names = args 
     options[:precision] ||= 8 
     options[:scale] ||= 2 
     column_names.each { |name| column(name, 'decimal', options) } 
    end                  
    end 
end 

Şimdi para yöntemini kullanabilirsiniz döviz sütun İhtiyacınız her zaman tanımlamak yok.

Örnek:

def self.up 
    create_table :products do |t| 
    t.currency :cost 
    t.timestamps 
    end 
end 

varolan tabloya bir para birimi sütun eklemek için:

def self.up 
    change_table :products do |t| 
    t.currency :sell_price 
    end 
end 

Uyarı: Bunu test etmek için zamanım yok bu yüzden hiçbir garantisi yoktur. Eğer işe yaramazsa, en azından sizi doğru yola koymalısınız.

+0

Bunu hemen test edeceğim. Çaba ve yardımın için teşekkürler! – Shyam

+0

Teşekkürler, bunun için sadece bir kullanımım vardı. Unutulmaması gereken bir şey: 't 'create_table' içinde' TableDefinition',' change_table' içinde 'Table' dır. Özel üretim kodumu bir modüle koydum ve her iki sınıfta da bunu dahil ettim. – Kolja

+0

Hi @emfi Bu gerçekten çok iyi .. Model para birimine sahip olmanın bir yolu daha var mı? Sadece bir düşünce çünkü ben örn. Aynı yerde aynı zamanda döviz giriş doğrulamaları için .. Ben de bunun için bakacağız ... – sethi