什么是Rails的迁移相当于MySQL'双'数据类型?

时间:2010-06-23 07:39:43

标签: mysql ruby-on-rails

我似乎无法通过搜索Google来解决这个问题。

我有一个现有的数据库,其中有一些类型为double的列,我会在rails迁移中写什么来创建一个等效的列类型?这是一个相对较旧的数据库,可能有一个更合适的数据类型可以完全使用,但我想看看其他人的想法。

我打算使用:decimal的类型,这是最好的选择吗?

思想?

7 个答案:

答案 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`)
)