情况:
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。
这是正常行为吗?我该如何最好地解决这个问题?
答案 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