0

情况:

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中包含键值对时,House 会被销毁,但不会更新为 NULL。"_destroy" => "true"house_attributesCellar.house_id

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

4

2 回答 2

0

这可能是正常的,具体取决于 Rails 的版本......我认为直到 Rails 3.2,在销毁对象时外键保持不变(当将外键更新为 nil 时反之亦然)是正常的。你用的是什么版本的 Rails?

但是,无论如何,如果您想继续保持原样并在保存后清理外键,@cellar那么您总是可以@cellar.reload在成功后调用@cellar.save。这将从@cellar数据库中刷新对象的状态并删除该house_id属性,因为它不再存在。

于 2013-08-31T21:28:25.693 回答
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
于 2013-09-01T10:16:45.493 回答