Rails4:无法修改冻结的哈希
Rails4: Can't modify frozen hash
Order
型号:
class Order < ActiveRecord::Base
has_many :sales, dependent: :destroy, inverse_of: :order
end
has_many Sale
s:
class Sale < ActiveRecord::Base
belongs_to :order, inverse_of: :sales
validates :order, :product, :product_group, :presence => true
before_create :price
def price
mrr = Warehouse.where(:product => self.product).pluck(:mrr).shift.strip.sub(',', '.').to_f
self.price = mrr * self.quantity.to_f
end
end
当我销毁一个 Order
时,关联的 Sale
也应该被销毁,但是我 运行 这样做时出错了:
RuntimeError in OrdersController#destroy
Can't modify frozen hash
此行已突出显示:self.price = mrr * self.quantity.to_f
。
逐步手动销毁所有关联的 Sale
s 记录,没有错误。没有Sale
关联后,我也可以销毁Order
记录。
有什么想法吗?
在突出显示的行上,您应该确保 sale
在更新其 price
属性时未被破坏:
self.price = mrr * quantity.to_f unless destroyed? # notice, no need for self before quantity
# or
write_attribute(:price, mrr * quantity.to_f) unless destroyed?
我遇到了同样的问题并搜索了答案。只找到关于 destroyed 的讨论;但是我已经确定,如果我创建一个新的活动记录 (find_or_create_by),然后创建依赖于第一个活动记录的第二个对象,我会得到同样的错误。我通过在第二个 creating/modifying 之前保存第一个活动记录来解决它。我不明白为什么创建是必要的,尽管我可以理解为什么第二条记录希望第一个记录在它获得 saved/modified.
之前存在
我将 Rails 从 4.1 升级到 4.2.5,并在尝试使用标签保存对象时出现此错误。
在我的例子中,问题是 gem 'acts-as-taggable-on' 应该升级到更新版本 >= 3.4。
Order
型号:
class Order < ActiveRecord::Base
has_many :sales, dependent: :destroy, inverse_of: :order
end
has_many Sale
s:
class Sale < ActiveRecord::Base
belongs_to :order, inverse_of: :sales
validates :order, :product, :product_group, :presence => true
before_create :price
def price
mrr = Warehouse.where(:product => self.product).pluck(:mrr).shift.strip.sub(',', '.').to_f
self.price = mrr * self.quantity.to_f
end
end
当我销毁一个 Order
时,关联的 Sale
也应该被销毁,但是我 运行 这样做时出错了:
RuntimeError in OrdersController#destroy
Can't modify frozen hash
此行已突出显示:self.price = mrr * self.quantity.to_f
。
逐步手动销毁所有关联的 Sale
s 记录,没有错误。没有Sale
关联后,我也可以销毁Order
记录。
有什么想法吗?
在突出显示的行上,您应该确保 sale
在更新其 price
属性时未被破坏:
self.price = mrr * quantity.to_f unless destroyed? # notice, no need for self before quantity
# or
write_attribute(:price, mrr * quantity.to_f) unless destroyed?
我遇到了同样的问题并搜索了答案。只找到关于 destroyed 的讨论;但是我已经确定,如果我创建一个新的活动记录 (find_or_create_by),然后创建依赖于第一个活动记录的第二个对象,我会得到同样的错误。我通过在第二个 creating/modifying 之前保存第一个活动记录来解决它。我不明白为什么创建是必要的,尽管我可以理解为什么第二条记录希望第一个记录在它获得 saved/modified.
之前存在我将 Rails 从 4.1 升级到 4.2.5,并在尝试使用标签保存对象时出现此错误。
在我的例子中,问题是 gem 'acts-as-taggable-on' 应该升级到更新版本 >= 3.4。