【问题标题】:Remove default_scope in association删除关联中的 default_scope
【发布时间】:2014-05-26 09:54:20
【问题描述】:

我有一个使用 Paranioa gem (https://github.com/radar/paranoia) 的模型,用于将已删除的 ActiveRecord 元素保留在数据库中。 Paranioa 使用deleted_at 列;当此列为NULL 时,对象不会被删除。它使用默认范围工作,如下所示:

default_scope { where(:deleted_at => nil) }

我的问题是我想获取范围内的所有元素(包括已删除的元素):

class MyOtherModel < ActiveRecord::Base
   has_many :paranoia_models
end

此声明生成如下查询:

SELECT * FROM `paranioa_models` WHERE `paranioa_models`.`deleted_at` IS NULL AND ...

使用这样的函数很容易获取我所有的元素(包括已删除的元素)

def paranioa_models_with_deleted
  return self.paranioa_models.with_deleted
end

with_deleted unscope 默认作用域。

我的问题是:如何直接在 :has_many 范围内取消这个 default_scope 在 MyOtherModel 范围内的范围?

您的解决方案:

  • has_many :paranoia_models, -&gt; { unscoped } 仅返回未删除的内容
  • self.paranoia_models.unscoped 返回所有的ParanoiaModel(包括属于其他人的ParanoiaModel)

【问题讨论】:

  • has_many :paranoia_models, -&gt; { unscoped } 似乎不起作用,我猜default_scope 是之后应用的......
  • unscoped 应该可以使用 AFAIK,但为什么不简单地使用 self.my_other_models.unscoped
  • @Stefan > 感谢您的回复,我直接回答了我的问题。

标签: ruby ruby-on-rails-4 associations


【解决方案1】:

你试过了吗?

def paranoia_models
   ParanoiaModel.unscoped { super }
end

【讨论】:

    【解决方案2】:

    你可以删除或覆盖rails中的default_scope。 例如:

    default_scope { where(:deleted_at => nil) }
    
    ParanioaModel.all
    
    ParanioaModel.unscoped.all
    

    unscope 将跳过此处的默认范围。

    【讨论】:

    • 是的,我知道,但我怎样才能直接在 has_many 声明中执行此操作?
    • 必须这样做... has_many :paranoia_models, -> { where(:deleted_at => Time.now) } 你可以在这里添加你的条件。
    • 我不想删除或取消删除,我想要“两者”。 where 条件不能取消 default_scope 的作用域,它只会添加条件。
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多