首页 > 解决方案 > 从延迟加载的模型中获取 activerecord 关系

问题描述

我知道 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

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

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

我在 Rails 5.0.3 和 ActiveRecord 5.0.6 上

标签: ruby-on-railsrubyactiverecordrails-activerecord

解决方案


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


推荐阅读