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 急切加载所有发现的主要内容,如果未能解决你的问题,请参考以下文章