【发布时间】:2016-07-29 18:46:31
【问题描述】:
我有一个名为Family 的模型,它与Parent 有has_many 关系:
class Family < ActiveRecord::Base
has_many :parents, :dependent => :destroy
end
当用户删除Family 时,它应该删除所有关联的Parent。
有一个主要问题:我有一个多租户环境(使用 Apartment gem),并且父母处于公共架构中。因此,我只需要选择在同一帐户中应该删除的父母。
现在,当在 Family 上调用 destroy 时,我得到:
SELECT "public"."users".* FROM "public"."users" WHERE "public"."users"."type" IN ('Parent') AND "public"."users"."family_id" = $FAMILY_ID
我需要它:
SELECT "public"."users".* FROM "public"."users" WHERE "public"."users"."type" IN ('Parent') AND "public"."users"."family_id" = $FAMILY_ID AND "public"."users"."account_id" = $CURRENT_ACCOUNT_ID
有没有办法覆盖Family.destroy 方法,使其只选择正确的关联记录?
【问题讨论】:
-
您可以在此处添加范围以过滤
has_many :parents, ->() { <some-condition>}, :dependent => :destroy。这样,您可以有条件地删除记录。将CURRENT_ACCOUNT_ID作为参数传递给范围 lambda。 -
@ArupRakshit 如果
CURRENT_ACCOUNT_ID仅在控制器中可用,因为它是请求的一部分,这可能吗? -
我没听懂你。 :) 但是你可以从任何地方传递像
Family.parents(CURRENT_ACCOUNT_ID).destroy_all这样的值。 -
@ArupRakshit 好的,但我如何让
has_many :parents, :dependent => :destroy做到这一点?我应该删除dependent: :destroy并在Family.destroy上执行回调吗?或者覆盖Family.destroy? -
你不需要重写方法,你会像我上面那样调用它。通过这个
:dependent => :destroy,你告诉AR,删除你从调用family.parents(CURRENT_ACCOUNT_ID).destroy_all获得的孩子,其中family是Family的一个实例。
标签: ruby-on-rails associations rails-activerecord