Rails - 有没有办法为模型的 ActiveRecord::Relation 查询设置可重写的“默认”过滤器(即预运行类方法)?

bou*_*uby 3 ruby activerecord ruby-on-rails default-constructor active-relation

我有一组记录正在从另一种格式推送到数据库中。根据我的记录所谓的唯一 ID,我推送到数据库中的一些记录正在回滚,因为它说它们是重复的。但我检查了一下,虽然它们非常相似,但记录中存在差异,这表明我在将数据放入数据库之前处理数据时出现了某种错误,或者是这个特定州政府在维护具有重复数据的数据库时出现了错误同一实体的记录。我现在还不确定。

我想将此官方记录/列表中所谓的“重复项”存储在我的数据库中,但用布尔列标记它们,该列随后可用于(基于零/真区分)过滤掉我的所有 ActiveRecord默认情况下查询该模型。

理想情况下,这将允许我做一些会导致如下行为的事情:

ModelName.all.count
#=> 500

ModelName.count
#=> 623

ModelName.include_alleged_duplicates.count
#=> 623
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到这一点而不破坏事情太严重吗?

CDu*_*Dub 5

听起来您正在寻找的是default_scope,记录在Rails API 中。

因此,您的模型更改将类似于:

class ModelName
    default_scope where(:duplicate => false)

    ...

    def self.include_alleged_duplicates
        unscoped
    end
end
Run Code Online (Sandbox Code Playgroud)

unscoped就是这样做的,它在模型上以零范围运行。请参阅unscoped 的文档。

唯一的问题default_scope是它用于模型中的每个关系。就像你的例子一样:

ModelName.all有default_scope意愿执行ModelName.where(:duplicate => false).all

如果您发现自己使用的unscoped越来越多,您可能需要考虑反转您的逻辑,使重复记录成为default_scope,唯一记录成为unscoped。

希望这可以帮助!