从延迟加载的模型中获取活动记录关系

Get an activerecord relation from a model that is lazy loaded

我知道 ActiveRecord 有延迟加载的查询,您可以在其中向现有查询添加过滤器,并在最后调用查询。

示例:Model.where(filter1: true).where.not(filter2: true).....

在我的代码中,我有一个条件,如果它应该被切片,则向查询添加一个切片过滤器,如果它不被切片,则使用另一个模型。代码如下:

def base_query
  @base_query ||= slice? ? slice_class.where(slice_value: @slice.value, slice_type: @slice.type) : hour_class
end

问题是这会产生不一致的 return 类型。如果事物被切片,则为 ActiveRecord 关系,否则它 return 是一个 ActiveRecord 模型。

如果我在 hour_class 末尾添加 .all 它将变得一致,但此时它会命中数据库。如何在不丢失延迟加载的情况下保持一致?

我在 Rails 5.0.3 和 ActiveRecord 5.0.6

您可以使用 hour_class.default_scoped。如果您想忽略任何默认范围,您可以使用 hour_class.unscoped.