accepted_nested_attributes_for,带键“_destroy”

时间:2013-08-31 20:21:36

标签: ruby-on-rails nested-attributes destroy

情况:

class Cellar < ActiveRecord::Base
  belongs_to :house, dependent: :destroy

  accepts_nested_attributes_for :house, allow_destroy: true

  attr_accessible :house_id, :house_attributes, [...]
end

class House < ActiveRecord::Base
  has_one: cellar
end

问题:

当我发送Cellar表单并在"_destroy" => "true"中包含键值对house_attributes时,House会被摧毁,但Cellar.house_id不是更新为NULL。

这是正常行为吗?我该如何最好地解决这个问题?

2 个答案:

答案 0 :(得分:0)

这可能是正常的,具体取决于Rails的版本......我想在Rails 3.2之前,外键在销毁对象时保持不变是正常的(反之亦然,当将外键更新为nil时)。您使用的是哪个版本的Rails?

但是,无论如何,如果您希望保持原样,只需在保存后清除@cellar上的外键,那么您可以随时在成功@cellar.reload后拨打@cellar.save。这将从数据库中刷新@cellar对象的状态,并删除house_id属性,因为它已不再存在。

答案 1 :(得分:0)

为了完整起见,这是我为了解决问题而最终做的事情:

class Cellar < ActiveRecord::Base
  belongs_to :house, dependent: :destroy

  accepts_nested_attributes_for :house, allow_destroy: true

  attr_accessible :house_id, :house_attributes, [...]

  # I ADDED THIS:
  before_save :drop_invalid_id
  def drop_invalid_id
    self.house_id = nil if house.marked_for_destruction?
  end
end