17

Order型号:

class Order < ActiveRecord::Base
  has_many :sales, dependent: :destroy, inverse_of: :order
end

has_many Sales:

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

当我销毁 anOrder时,关联Sale的 s 也应该被销毁,但是这样做时遇到了错误:

RuntimeError in OrdersController#destroy
Can't modify frozen hash

此行突出显示:self.price = mrr * self.quantity.to_f

Sale逐步手动销毁所有关联的 s 记录没有错误。没有Sale关联后,我也可以销毁Order记录。

有任何想法吗?

4

3 回答 3

28

在突出显示的行上,您应该确保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?
于 2016-01-20T09:32:49.100 回答
2

我遇到了同样的问题并搜索了答案。只找到了关于销毁的讨论;但是我已经确定,如果我创建一个新的活动记录(find_or_create_by),然后根据第一个活动记录创建第二个对象,我会得到同样的错误。我通过在创建/修改第二个之前保存第一个活动记录来解决它。我不明白为什么需要创建,尽管我可以看到为什么第二个记录希望第一个记录在保存/修改之前存在。

于 2018-09-18T18:06:21.447 回答
1

我将 Rails 从4.1升级到4.2.5并尝试使用标签保存对象时出现此错误。

在我的情况下,问题是由于gem 'acts-as-taggable-on'应该升级到更新版本> = 3.4。

于 2018-09-23T17:21:57.570 回答