Ruby on 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行更改为上述内容 我不喜

我必须使用Rails迁移创建一个数据库模式

我有很多列,包含数量(千克)和价格(货币)

目前我使用的是:

  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”更改为上面的示例。(使用常规列类型,添加精度参数)