【发布时间】:2017-01-10 19:37:23
【问题描述】:
我和我的同事注意到有关 ActiveRecord has_one 关联的一些东西感觉错误/危险并且似乎不容易记录。
假设我们有这样的设置:
class User < ApplicationRecord
has_one :subscription
end
class Subscription < ApplicationRecord
belongs_to :user
end
没有“依赖:销毁”
> user = User.create(name: "Bob")
> user.subscription = Subscription.create(provider: "Stripe")
> user.subscription = nil
(0.1ms) begin transaction
SQL (0.4ms) UPDATE "subscriptions" SET "user_id" = ?, "updated_at" = ? WHERE "subscriptions"."id" = ? [["user_id", nil], ["updated_at", 2017-01-10 19:24:56 UTC], ["id", 2]]
(2.0ms) commit transaction
用“依赖:销毁”
class User < ApplicationRecord
has_one :subscription, dependent: :destroy
end
> user = User.create(name: "Bob")
> user.subscription = Subscription.create(provider: "Stripe")
> user.subscription = nil
(0.1ms) begin transaction
SQL (1.1ms) DELETE FROM "subscriptions" WHERE "subscriptions"."id" = ? [["id", 1]]
(0.7ms) commit transaction
这是预期的行为吗?实际上,我很惊讶在没有明确调用 save 或 destroy 或 update 等的情况下进行 SQL 调用。我也很困惑为什么 dependant: destroy 在这种情况下会改变行为。
这是否应该发生,如果发生,是否记录在任何地方? dependant: destroy 版本似乎特别危险。
这是用 Rails 5 以及几个版本的 Rails 4 测试的。
【问题讨论】:
-
正如其他人所说,这是预期行为或至少设计行为Source Reference for HasOneAssociation#replace。本质上,您正在用
nil“替换”Subscription,如果options[:dependent] == :destroy,这会导致Subscription#destroy,否则它会使关系无效。User#destroy的处理方式非常相似 Source
标签: ruby-on-rails ruby activerecord