Ruby on rails 可以在Rails迁移中使用自定义列类型吗?
我必须使用Rails迁移创建一个数据库模式 我有很多列,包含数量(千克)和价格(货币) 目前我使用的是:Ruby on rails 可以在Rails迁移中使用自定义列类型吗?,ruby-on-rails,migration,Ruby On Rails,Migration,我必须使用Rails迁移创建一个数据库模式 我有很多列,包含数量(千克)和价格(货币) 目前我使用的是: t.column :quantity, :decimal, :precision => 6, :scale => 3 t.column :value, :decimal, :precision => 6, :scale => 2 在生成器调用中,我使用quantity:decimal来标识我的列。然后,我手动将生成的t.decimal行更改为上述内容 我不喜
t.column :quantity, :decimal, :precision => 6, :scale => 3
t.column :value, :decimal, :precision => 6, :scale => 2
在生成器调用中,我使用quantity:decimal
来标识我的列。然后,我手动将生成的t.decimal
行更改为上述内容
我不喜欢这样,因为每次生成迁移之后,我都必须手动编辑迁移脚本,而且我担心会出现干迁移。(如果价格必须包含四位而不是小数点后两位怎么办?)
是否可以创建一个自定义列类型,我可以在迁移甚至生成器中使用它,如下所示:
t.quantity :quantity
t.price :value
PS:我是一个Rails noob,如果这是一个愚蠢的问题,我很抱歉。我相信你可以做你想做的事情——深入研究迁移代码中的column方法——但我认为它不是自然支持的。我认为迁移的想法是它们非常接近数据库语言(并且离您的域模型更远),因此支持非常以数据库为中心 查看使用with_选项(railscasts.com/scents/42 with options)。这将允许您在不修补rails的情况下完成单个迁移 您还可以在迁移中创建帮助器方法,使其变干。我一直都这样做。。。迁移只是一个Ruby类,因此您可以创建: def货币(列)
添加列:我的表,列,:deci。。。等等。只是一个跟进:我最终用猴子修补了导轨:
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
“手动修复迁移脚本”的确切含义是什么?现在我只在生成器调用中使用“quantity:decimal”。然后我必须编辑生成的迁移脚本,并将“t.decimal:quantity”更改为上面的示例。(使用常规列类型,添加精度参数)