嵌套包含在Rails上的位置

时间:2017-02-14 12:41:05

标签: ruby-on-rails activerecord

假设我们有3张桌子:

products (title, product_type_id)
product_types (title)
product_type_options (product_type_id, size)

我想加载产品,它的类型和&仅限特定product_type_options(product_type_options.size = 'XL'

是否可以在rails中进行N + 1查询?

类似的东西:

Product.includes( product_type: [product_type_options] )
       .where("product_type_options.size = 'XL'")

我不能让它与where参数一起使用。任何的想法?

4 个答案:

答案 0 :(得分:3)

这应该有效

Product.includes(product_type: :product_type_options)
  .where(product_types: { product_type_options: { size: 'XL' } })

答案 1 :(得分:1)

@Iceman很接近......之所以没有看到'product_types'是因为它需要在where子句中表示为显式哈希,那么Ruby将进行正确的嵌套...

Product.includes(product_type: :product_type_options)
  .where({ product_types: { product_type_options: { size: 'XL' } } })

很奇怪,但在where子句中添加额外的 {} 会使嵌套包含起作用。

答案 2 :(得分:-2)

您可以使用联接

Product.joins(product_type: :product_type_options).where("product_type_options.size = 'XL'")

答案 3 :(得分:-2)

请尝试这个,这是一个小的语法更改。我没有测试过。让我知道它是否有效:))

Product.includes( product_type: [product_type_options] )
   .where("product_type_options.size" => 'XL')