从延迟加载的模型中获取 activerecord 关系

Posted

技术标签:

【中文标题】从延迟加载的模型中获取 activerecord 关系【英文标题】:Get an activerecord relation from a model that is lazy loaded 【发布时间】:2019-02-07 20:34:09 【问题描述】:

我知道 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 模型。

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

我在 Rails 5.0.3 和 ActiveRecord 5.0.6 上

【问题讨论】:

hour_class.all 怎么样?只要您不访问它返回的关系,它就不应该访问数据库。 【参考方案1】:

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

【讨论】:

以上是关于从延迟加载的模型中获取 activerecord 关系的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot jpa 中将延迟加载的对象转换为 JSON

延迟 AngularJS 路由更改直到模型加载以防止闪烁

Symfony Doctrine ORM ManyToMany - 带有标签的博客 - 我没有从博客中获取所有标签,没有延迟加载

PHP ActiveRecord - 在模型中找不到关联

休眠从对象中延迟获取嵌套列表

如何启用对多关系对象属性的延迟加载?