从延迟加载的模型中获取 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
Symfony Doctrine ORM ManyToMany - 带有标签的博客 - 我没有从博客中获取所有标签,没有延迟加载