:dependent => :destroy 不适用于 has_one 关系
:dependent => :destroy doesn't work on has_one relation
在我的模型中
class User < ActiveRecord::Base
has_one :user_detail, dependent: :destroy
end
和
class UserDetail < ActiveRecord::Base
belongs_to :user
end
当我为 User 对象调用 destroy 时,关联的 UserDetail 对象没有被销毁。
这里做个测试(当然失败是因为user_detail
不是nil):
test "associate object should be destroyed" do
user_id = @user.id
@user.destroy
user_detail = UserDetail.find_by(:user_id => user_id)
assert_nil user_detail
end
有人知道为什么会这样吗?
你的逻辑没问题,问题出在你的测试代码上。试试这个:
test "associate object should be destroyed" do
user_detail = @user.user_detail
@user.destroy
expect(UserDetail.find_by(:user_id => @user.id)).to be_nil
end
发生的事情是对应于 user_detail
的数据库行正在被销毁,但变量仍然保留值。
编辑以回复评论,因为我无法将代码块放在评论中:
@user.id 不是 nil 因为,如果你测试它,你会看到 id 仍然保留,因为它是内存模型。我有一个正在测试的随机 rails 应用程序,这是一些控制台输出:
irb(main):002:0> l = Loan.first
irb(main):003:0> l.destroy
irb(main):004:0> l.id
=> 14
在我的模型中
class User < ActiveRecord::Base
has_one :user_detail, dependent: :destroy
end
和
class UserDetail < ActiveRecord::Base
belongs_to :user
end
当我为 User 对象调用 destroy 时,关联的 UserDetail 对象没有被销毁。
这里做个测试(当然失败是因为user_detail
不是nil):
test "associate object should be destroyed" do
user_id = @user.id
@user.destroy
user_detail = UserDetail.find_by(:user_id => user_id)
assert_nil user_detail
end
有人知道为什么会这样吗?
你的逻辑没问题,问题出在你的测试代码上。试试这个:
test "associate object should be destroyed" do
user_detail = @user.user_detail
@user.destroy
expect(UserDetail.find_by(:user_id => @user.id)).to be_nil
end
发生的事情是对应于 user_detail
的数据库行正在被销毁,但变量仍然保留值。
编辑以回复评论,因为我无法将代码块放在评论中:
@user.id 不是 nil 因为,如果你测试它,你会看到 id 仍然保留,因为它是内存模型。我有一个正在测试的随机 rails 应用程序,这是一些控制台输出:
irb(main):002:0> l = Loan.first
irb(main):003:0> l.destroy
irb(main):004:0> l.id
=> 14