2009-09-20 47 views
1

我必须使用Rails迁移创建数据库模式。是否可以在Rails迁移中使用自定义列类型?

我有很多列包含数量(公斤)和价格(货币)。

目前我使用这个:

t.column :quantity, :decimal, :precision => 6, :scale => 3 
    t.column :value, :decimal, :precision => 6, :scale => 2 

在发电机呼叫我用quantity:decimal识别我的专栏。然后我手动将生成的t.decimal行更改为上面的行。

我不喜欢这样,因为在每次生成迁移后,我都必须手动编辑迁移脚本,并且担心DRY。 (如果价格已包含四个而非两位小数?)

是否有可能创造我可以在迁移,甚至发电机使用自定义字段类型,就像这样:

t.quantity :quantity 
    t.price :value 

PS:我是Rails noob,如果这是一个愚蠢的问题,我很抱歉。

+0

你是什么意思“手动必须修复迁移脚本”? – hgmnz 2009-09-20 14:38:21

+0

现在我只是在生成器调用中使用“数量:十进制”。然后,我必须编辑生成的迁移脚本,并将“t.decimal:quantity”更改为上面的示例。 (使用通用列类型,添加精度参数) – 2009-09-20 14:43:28

回答

1

我确定你可以做你正在问的问题 - 挖掘迁移代码中的列方法 - 但我不认为它是自然支持的。我认为迁移的想法是他们非常接近数据库语言(并且离开你的域模型),所以支持非常适合数据库。

请看使用with_options(railscasts.com/episodes/42-with-options)。这将允许您在不修补轨道的情况下完成一次迁移。

您也可以在迁移中使帮助器方法干掉它。我做这一切的时候...迁移仅仅是一个Ruby类,这样你就可以创建:

高清货币(列) add_column:MY_TABLE,列:慈...等

2

刚后续:我结束了猴子打补丁的Rails:

class ActiveRecord::ConnectionAdapters::TableDefinition 

    def price(*args) 
    options = args.extract_options! 
    options.reverse_merge!({ precision: 8, scale: 2 }) 
    column_names = args 
    type = :decimal 
    column_names.each { |name| column(name, type, options) } 
    end 

end 

,让我用price作为列式,这会导致一个干净的前瞻性迁移。

create_table :stuff do |t| 
    t.price :my_price 
end 
相关问题