Rails 急切加载所有发现

Posted

技术标签:

【中文标题】Rails 急切加载所有发现【英文标题】:Rails Eager Loading on All Finds 【发布时间】:2010-01-11 14:48:13 【问题描述】:

好的,我一直在玩一些急切加载的东西,并且有 2 个模型,例如:

Class Recipe < ActiveRecord::Base
    belongs_to :cookbook
    has_many   :recipetags
end

Class Cookbook < ActiveRecord::Base
    has_many :recipes, :include => [:recipetags]
end

效果很好,当我找到一本食谱时,我就急切地加载食谱,然后食谱急切地加载:recipetags:

cb = Cookbook.find(10590, :include => [:recipes])

但我还想做的是,每当我打开一个食谱时,让它自动拉入所有急切的关联 - 基本上我想做:

rec = Recipe.find(123)

在这种情况下也让它急切加载 :recipetags。

我意识到这似乎微不足道,但实际上我在 Recipe 上有大约 4-5 个关联,我只是没有在这里展示它们,而不是必须在每个 find 调用中明确地执行 :include 我想要它刚刚发生。我假设我可以覆盖 Recipe.find 以在 Recipe 模型中执行此操作,但想知道是否有更清洁的方法....

【问题讨论】:

【参考方案1】:

我一直在使用 default_scope 在我总是想要预先加载的选定模型上执行此操作:

class Post < ActiveRecord::Base
  has_many :comments
  default_scope :include => :comments, :order => ["title ASC"]
  ...
end

【讨论】:

这看起来不错 - 虽然它看起来只在 2.3+ 中可用,这在应用程序中引入了一些其他问题。我会看看我是否可以让 2.3.2 工作并进行测试。【参考方案2】:

您应该能够使用命名范围来执行此操作,但我知道其中存在许多可能的错误,希望它们现在都已修复。

【讨论】:

以上是关于Rails 急切加载所有发现的主要内容,如果未能解决你的问题,请参考以下文章

急切加载与加入获取相同吗?

Rails 急切加载

使用 Rails 查询急切加载

实施急切加载以停止 N+1 - Rails

使用急切加载时,实体框架是不是将所有相关实体加载到无限深度

Entity Framework Core 2.0.1 急切加载所有嵌套的相关实体