Ruby on rails Rails:在抓取关联时加载,而不是在查找时加载
我有三个嵌套模型:Ruby on rails Rails:在抓取关联时加载,而不是在查找时加载,ruby-on-rails,ruby-on-rails-3.1,eager-loading,Ruby On Rails,Ruby On Rails 3.1,Eager Loading,我有三个嵌套模型:user有许多plate和plate有许多果实。我还有一个current_userhelper方法,它在before过滤器中运行,以提供身份验证。所以当我到达我的控制器时,我已经有了我的user对象。如何一次装入所有用户的牌和水果 换句话说,我想做一些类似的事情: @plates = current_user.plates(include: :fruits) 我怎样才能做到这一点 我正在使用Rails 3.1.3。您可以这样做 ActiveRecord::Associatio
user
有许多plate
和plate
有许多果实。我还有一个current_user
helper方法,它在before过滤器中运行,以提供身份验证。所以当我到达我的控制器时,我已经有了我的user
对象。如何一次装入所有用户的牌
和水果
换句话说,我想做一些类似的事情:
@plates = current_user.plates(include: :fruits)
我怎样才能做到这一点
我正在使用Rails 3.1.3。您可以这样做
ActiveRecord::Associations::Preloader.new([current_user], :plates => :fruit).run
在当前_用户被释放后,立即加载关联。第二个参数可以是通常传递给的任何内容,包括
:符号、符号数组、散列等
@plates = current_user.plates.all(:include => :fruits)
应该这样做。您可能希望对您的关系使用提供的#includes
方法。不要使用#all
,除非您打算立即处理记录,否则它会立即破坏许多形式的缓存
可能类似于:@plates=当前用户.plates.includes(:fruits)
不幸的是,Rails API的某些部分并没有得到应有的良好记录。如果您对Rails查询界面有任何进一步的问题,我建议您查看以下资源:
查询接口可能是Rails堆栈中最难跟上的部分,尤其是在Rails 3.0和3.1进行了更改之后。问题的确是问如何加载所有内容。:)AR#all可以正常使用,除非你已经在大规模地处理一个站点,或者你知道你正在处理这个站点。最好的做法是尽可能长时间地延迟从数据库中实际查找#那次练习的所有失败都是我一直在寻找的。谢谢