我似乎无法通过搜索Google来解决这个问题。
我有一个现有的数据库,其中有一些类型为double
的列,我会在rails迁移中写什么来创建一个等效的列类型?这是一个相对较旧的数据库,可能有一个更合适的数据类型可以完全使用,但我想看看其他人的想法。
我打算使用:decimal
的类型,这是最好的选择吗?
思想?
答案 0 :(得分:20)
在我的情况下(用于测试db准备):
MySQL(带有mysql2(0.3.11)驱动程序):
double(64,12)
Rails(在db / schema.rb中):
t.float :limit=>64 ==> failed
t.float :limit=>53 ==> occasionally succeeded
t.decimal :precision=>64, :scale=>12 ==> fully succeeded
答案 1 :(得分:11)
double 没有特定的类型,Rails试图明白它:
数字(整数/十进制/浮点)列定义对整数列类型中的字节数使用:limit
选项,对浮点数使用:scale
/ :precision
选项。
(精度是有效位数;刻度是小数点后落后的数量。)
答案 2 :(得分:8)
您可以让Rails创建DOUBLE
。我不确定以下解决方案是如何“正式”支持的,但它适用于MySQL。只需将限制设置为53.例如:
t.float :published_at, :limit => 53, :null => true
我从this blog post得到了答案,并且还有更多关于此的测试结果。
答案 3 :(得分:5)
我发现这个解决方案存在问题。如果我有这样的声明:
t.float :latitude, :limit => 30
一切看起来都很棒:数据库架构显示该列被声明为double。问题是schema.rb缺少任何:limit值,因此当将模式克隆到测试环境中时,该列将变为float而不是double。单元测试失败,因为列中的准确性不够。
如果您查看ActiveRecord column definitions的文档,您会发现:
:limit - 请求最大列长度。这是多少 字符:string和:text列和字节数 :binary和:整数列。
关于花车的话题没有提及。从代码中可以看出,这是一个副作用:支持此解决方案的限制。看起来在schema.rb的生成中存在一个错误,或者它从来没有打算以这种方式使用。
我担心答案可能是:十进制数据类型(我不关心)是完全支持的解决方案。
答案 4 :(得分:2)
在Rails的现代版本中(我使用5.1)
t.column :field, "double"
答案 5 :(得分:0)
在您的迁移中:
t.decimal :amount, precision: 32, scale: 16, default: 0, null: false
答案 6 :(得分:0)
我遇到了这个问题。经过大量的Google搜索并阅读了Rails文档之后,我才发现这篇文章对我没有帮助。
我已按照Stephen的建议解决此问题。另外,我以这样的精度添加了括号:
t.column :cantidad, "double(6,3)"
我的rails版本是:Rails 6.0.3.2
这是我的迁移
class CreateDetalleVenta < ActiveRecord::Migration[6.0]
def change
create_table :detalle_venta do |t|
t.column :cantidad, "double(6,3)"
t.decimal :precio, precision: 11, scale: 2
t.references :venta, null: false, foreign_key: true
t.references :producto, null: false, foreign_key: true
t.timestamps
end
end
end
运行迁移后,它会生成此sql:
CREATE TABLE `detalle_venta` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
`cantidad` double(6,3), `precio` decimal(11,2), `venta_id` bigint NOT NULL, `producto_id` bigint NOT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, INDEX `index_detalle_venta_on_venta_id` (`venta_id`), INDEX `index_detalle_venta_on_producto_id` (`producto_id`), CONSTRAINT `fk_rails_166445d4ab`
FOREIGN KEY (`venta_id`)
REFERENCES `venta` (`id`)
, CONSTRAINT `fk_rails_c3914ce495`
FOREIGN KEY (`producto_id`)
REFERENCES `productos` (`id`)
)