使用预先加载和嵌套对象强制完整对象加载

时间:2016-11-16 23:06:02

标签: ruby-on-rails ruby activerecord rails-activerecord

我的对象模型有点像这样:

Order
    has_many line items
    has_many transactions
    has_many products through line items
Line Items
    has_one product

所以,要获得我去过的产品的所有订单:

product = Product.find(1)
Order.includes(:transactions, line_items: [:product]).where(line_items: {product: product})

这里的问题是,如果订单有5个订单项,我希望在查看订单对象时加载所有5个订单项。但是,使用上面的代码我只获得具有指定产品的订单项。有没有办法完全加载订单对象,而不是单独对每个项目进行.reload?只想急切加载整个对象。

1 个答案:

答案 0 :(得分:1)

这在一个查询中很难做到。我只能使用ActiveRecord方法得到的最直接的是:

Order.includes(:transactions, line_items: [:product])
     .where(id: LineItem.where(product: product).pluck(:order_id))

我对Arel了解不多,但我认为它可以在一个查询中完成,而不是两个。