2016-07-29 46 views
1

我有一个模型叫Family,它有一个has_many关系Parent我如何修改相关:对的has_many关系破坏查询

class Family < ActiveRecord::Base 
    has_many :parents, :dependent => :destroy 
end 

当用户删除Family,它应该删除任何关联Parent

有一个主要问题:我有一个多租户环境(使用公寓宝石)和父母在公共架构。因此,我需要选择只有父母在同一个帐户应该被删除。

眼下,当灭的呼吁Family我得到:

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法的方式进行这样它只会选择正确的关联记录?

+0

可以在此处添加一个范围来过滤'的has_many:父母, - >(){<某些条件>},:依赖=>:destroy'。这样你可以有条件地删除记录。将'CURRENT_ACCOUNT_ID'作为参数传递给范围lambda。 –

+0

@ArupRakshit如果'CURRENT_ACCOUNT_ID'仅在控制器中可用,这是可能的,因为它是请求的一部分? –

+1

我没有得到你。 :)但是你可以从任何地方通过'Family.parents(CURRENT_ACCOUNT_ID).destroy_all'这样的值。 –

回答

0

下面是我的解决方案。我从family.rb模型中的has_many :parents关系中删除dependent: :destroy子句。相反,我进行级联的家庭控制器的destroy行动删除:

def destroy 
    @family = Family.find(params[:id]) 
    authorize @family 

    parents = @family.parents.for_account(current_account.id) 

    @family.destroy 

    if @family.destroyed? 
    parents.destroy_all 
    end 

    redirect_to families_path 
end 

我不得不这样做的控制器,因为控制器知道current_account,而该模型是不是。对父模型的for_account方法看起来像这样:

scope :for_account, -> (id) { where(:account_id => id) }