将 decimal 列迁移到默认值 0 在架构中变为负值
Migrating a decimal column to default 0 becomes negative in the schema
我正在按照描述的步骤进行操作 here:
关于一些背景知识,此 Web 应用程序适用于拍卖管理系统。 Auction
class 中的 amount_raised
列应该代表美元数额,即在拍卖会上赚到的钱数。默认情况下,我希望它是 [=15=].00
。我在auction.rb
文件中的设置方法如下:
def amount_raised=(val)
currency = val.to_s.gsub(/[-$,]/,'').to_f if val.present?
write_attribute(:amount_raised, currency)
end
我尝试进行的第一次迁移如下:
change_column_default :auctions, :amount_raised, from: nil, to: 0.00
但是,此更改导致我的 schema.rb
文件中出现以下内容(精度和比例已经存在):
t.decimal "amount_raised", precision: 5, scale: 2, default: -0.0
我尝试进行另一次迁移以将默认值从 -0.0
更改为 nil
(因为我想如果我不能让 0 工作,我可以在视图中使用正确的格式检查 nil 并让它打印 $0.00),但默认值仍为 -0.0。
我试图回滚迁移,但它们抛出异常 "irreversible migrations",这是我试图通过使用 from: nil, to: 0.00
开始来避免的。
我的问题是,按照 Rails 指南中的格式,我做错了什么?解决此问题的最佳方法是什么?
只是 运行 一个空迁移:
rails generate migration AddAmountRaisedToAuctions
然后在您的 change
方法中添加以下代码:
def change
change_column :auctions, :amount_raised, :decimal, :null => false, :default => 0
end
现在运行耙db:migrate。
我正在按照描述的步骤进行操作 here:
关于一些背景知识,此 Web 应用程序适用于拍卖管理系统。 Auction
class 中的 amount_raised
列应该代表美元数额,即在拍卖会上赚到的钱数。默认情况下,我希望它是 [=15=].00
。我在auction.rb
文件中的设置方法如下:
def amount_raised=(val)
currency = val.to_s.gsub(/[-$,]/,'').to_f if val.present?
write_attribute(:amount_raised, currency)
end
我尝试进行的第一次迁移如下:
change_column_default :auctions, :amount_raised, from: nil, to: 0.00
但是,此更改导致我的 schema.rb
文件中出现以下内容(精度和比例已经存在):
t.decimal "amount_raised", precision: 5, scale: 2, default: -0.0
我尝试进行另一次迁移以将默认值从 -0.0
更改为 nil
(因为我想如果我不能让 0 工作,我可以在视图中使用正确的格式检查 nil 并让它打印 $0.00),但默认值仍为 -0.0。
我试图回滚迁移,但它们抛出异常 "irreversible migrations",这是我试图通过使用 from: nil, to: 0.00
开始来避免的。
我的问题是,按照 Rails 指南中的格式,我做错了什么?解决此问题的最佳方法是什么?
只是 运行 一个空迁移:
rails generate migration AddAmountRaisedToAuctions
然后在您的 change
方法中添加以下代码:
def change
change_column :auctions, :amount_raised, :decimal, :null => false, :default => 0
end
现在运行耙db:migrate。