Как объединить два запроса в Rails с помощью поддержки OR - PullRequest
0 голосов
/ 24 февраля 2020

Я хотел бы объединить два запроса, используя «ИЛИ» Active Record:

@category_ids = [4,5,6,7]
@sub_category_ids = [1,3,5,6]

@products1 = @products.joins(:inventory_categorizations).distinct.where(inventory_categorizations: {inventory_category_id: @sub_category_ids, inventory_category_type: "SubCategory"})

@products2 = @products.joins(:inventory_categorizations).distinct.where(inventory_categorizations: {inventory_category_id: @category_ids, inventory_category_type: "Category"})

@products = @products1 | @products2

Есть ли возможность использовать это?

@products = @products.joins(:inventory_categorizations).distinct.where(inventory_categorizations: {inventory_category_id: @sub_category_ids, inventory_category_type: "SubCategory" or inventory_category_id: @category_ids, inventory_category_type: "Category"})

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Вы можете сделать что-то вроде -

@products.joins(:inventory_categorizations)
         .distinct
         .where(inventory_categorizations: {inventory_category_id: @sub_category_ids, inventory_category_type: "SubCategory"})
         .or(
           @products.joins(:inventory_categorizations)
           .distinct
           .where(inventory_categorizations: {inventory_category_id: @category_ids, inventory_category_type: "Category"})
         )
0 голосов
/ 24 февраля 2020

Вы можете достичь этой цели двумя различными способами:

  1. Написание предложения where самостоятельно:

    where_clause = <<~SQL
      (
        inventory_categorizations.inventory_category_id = ?
        AND 
        inventory_categorizations.inventory_category_type = ?
      )
      OR 
      (
        inventory_categorizations.inventory_category_id = ?
        AND
        inventory_categorizations.inventory_category_type = ?
      )
    SQL
    
    @products.joins(:inventory_categorizations)
            .where(where_clause, @sub_category_ids, "SubCategory", @category_ids, "Category")
            .distinct
    
    
  2. Использование Active Запишите метод QueryMethods#or, если вы используете Rails версии 5 или выше. Все, что вам нужно сделать, это использовать or вместо оператора | (или):

    @products = @products1.or(@products2)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...