Rails:急于加载获取关联,而不是查找

时间:2012-01-07 23:43:15

标签: ruby-on-rails ruby-on-rails-3.1 eager-loading

我有三个嵌套模型:user有很多platesplate有很多fruits。我还有一个current_user辅助方法,它在before过滤器中运行以提供身份验证。所以当我到达我的控制器时,我已经有了user个对象。如何一次加载所有用户的platesfruits

换句话说,我想做点什么:

@plates = current_user.plates(include: :fruits)

我怎样才能做到这一点?

我正在使用Rails 3.1.3。

3 个答案:

答案 0 :(得分:1)

您可能希望在关系中使用提供的#includes方法。不要使用#all除非您打算立即处理记录,否则它将立即失败多种形式的缓存。

可能类似于:@plates = current_user.plates.includes(:fruits)

不幸的是,Rails API的某些部分没有得到应有的详细记录。如果您对Rails查询界面有任何疑问,我建议您查看以下资源:

查询接口可能是Rails堆栈中最难以跟上的部分,特别是使用Rails 3.0和3.1进行的更改。

答案 1 :(得分:0)

你可以做到

ActiveRecord::Associations::Preloader.new([current_user], :plates => :fruit).run

在current_user被淡化后急切加载关联。第二个参数可以是您通常传递给includes的任何内容:符号,符号数组,哈希等

答案 2 :(得分:-2)

@plates = current_user.plates.all(:include => :fruits)

应该这样做。