2010-04-11 101 views
15

我想知道如何創建一個自定義數據類型在耙子遷移文件中使用。示例:如果您要創建模型,則可以在遷移文件內添加列。它看起來是這樣的:Rails:創建一個自定義數據類型/創建一個速記

def self.up 
    create_table :products do |t| 
     t.column :name, :string 
     t.timestamps 
    end 
    end 

我想知道如何創建這樣的事情:

t.column :name, :my_custom_data_type 

這樣做的原因,以創建例如「貨幣」類型,它是僅此而已而不是精度爲8,刻度爲2的小數。由於我僅使用MySQL,因此該數據庫的解決方案已足夠。

感謝您的反饋和評論!

+0

對貨幣使用浮點數據類型通常是一個可怕的想法。 – 2010-04-11 15:06:42

+0

如果您有更好的解決方案,請詳細說明。 – Shyam 2010-04-11 15:08:58

+1

使用像錢寶石,http://money.rubyforge.org/。 – theIV 2010-04-11 15:13:25

回答

21

您要做的是定義一個新的列創建方法,該方法提供了創建自定義類型的選項。這基本上是通過添加一個在遷移中的行爲如t.integer ...的方法來完成的。訣竅是搞清楚在哪裏添加代碼。

一些地方在你的初始化目錄的地方這個代碼片段:

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 

現在你可以使用的貨幣方法做定義的貨幣列,你需要它的時候。

例子:

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

爲貨幣列添加到現有表:

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

警告:我沒有時間來測試它,所以沒有保證。如果它不起作用,那至少應該讓你走上正軌。

+0

我要馬上測試一下。感謝您的努力和您的幫助! – Shyam 2010-04-11 16:27:59

+0

謝謝,我剛剛有這個用法。有一點需要注意:'t'是'create_table'中的'TableDefinition',而'change_table'中的'Table'。我將自定義的代碼放入一個模塊中,並將其包含在這兩個類中。 – Kolja 2014-12-07 14:28:10

+0

嗨@emfi這真的很不錯..有沒有辦法讓它進一步像有一個模型貨幣?只是一個想法,因爲我想要例如貨幣輸入驗證在同一地點也..我也會尋找..那麼..謝謝 – sethi 2015-06-23 01:44:50