3

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

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

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

ModelName.all.count
#=> 500

ModelName.count
#=> 623

ModelName.include_alleged_duplicates.count
#=> 623

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

4

2 回答 2

5

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

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

class ModelName
    default_scope where(:duplicate => false)

    ...

    def self.include_alleged_duplicates
        unscoped
    end
end

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

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

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

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

希望这可以帮助!

于 2013-11-03T03:33:40.017 回答
0

Rails v5.2.3开始,default_scope现在只需要块。

class Article < ActiveRecord::Base
  default_scope { where(published: true) }
end

Article.all # => SELECT * FROM articles WHERE published = true
于 2021-12-22T05:46:15.180 回答