Rails4:无法修改冻结哈希

时间:2016-01-20 09:11:49

标签: ruby-on-rails ruby-on-rails-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记录,无错误。在没有Sale关联之后,我也可以销毁Order记录。

任何想法?

3 个答案:

答案 0 :(得分:16)

在突出显示的行上,您应确保在更新其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?

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我将Rails从 4.1 升级到了 4.2.5 ,并在尝试保存带有标签的对象时遇到此错误。 就我而言,麻烦是 gem'acts-as-taggable-on',应将其升级到> = 3.4的较新版本。

希望这会有所帮助