gpt4 book ai didi

ruby-on-rails - Big Decimal 存储为 60.00,返回为 0.0?

转载 作者:行者123 更新时间:2023-12-04 12:58:25 24 4
gpt4 key购买 nike

我正在 Rails 4 中自定义 Spree 2.3 应用程序。当我保存 price.amount 时,它似乎正确保存在数据库中,但是当我检索它时,它被包装在 BigDecimal 类中并返回 0。

如何存储或检索正确的值?

# in the form
<%= number_field_tag :amount %>

# controller action
@variant.price = params[:amount]

# appears in PostgresQL database as type 'numeric'
id: 35, amount: 60.00

# retrieved in Rails console as BigDecimal class instance
# looks like the wrong amount
2.1.1 :001 > Spree::Price.find_by_id(35).amount
=> #<BigDecimal:105806d20,'0.0',9(27)>

# converts to 0.0
2.1.1 :002 > Spree::Price.find_by_id(35).amount.to_f
=> 0.0

# testing data retrieval in the console
2.1.1 :003 > ActiveRecord::Base.connection.execute("SELECT * FROM spree_prices WHERE id=35").first
=> {"id"=>"35", "variant_id"=>"35", "amount"=>"60.00", "currency"=>"USD", "deleted_at"=>nil}
2.1.1 :004 > Spree::Price.find(35)
=> #<Spree::Price id: 35, variant_id: 35, amount: #<BigDecimal:109ec4a28,'0.0',9(27)>, currency: "USD", deleted_at: nil>

最佳答案

问题在于价格模型装饰器中的拼写错误。纯 PostgresQL 不会触发回调,但使用 'find' 方法会。这解释了上面看似不可能的结果。

#original price_decorator.rb
after_initialize :set_defaults

def set_defaults
self.amount = 0.0
end

#corrected price_decorator.rb
after_initialize :set_defaults

def set_defaults
self.amount ||= 0.0
end

关于ruby-on-rails - Big Decimal 存储为 60.00,返回为 0.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25048626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com