Несколько где предложения в рельсах searchkick

У меня есть очень простой вопрос о поиске. Что если вы хотите, чтобы вы объединяли несколько операторов where в поисковом запросе, используя операторы if. Очень похоже на построитель запросов

    @product = Product.all

    unless request.end_date.nil?
        @product = @product.search, where('created_at <= ?', request.end_date)
    end 

    unless request.max_price.nil?
        @product = @product.search, where('price <= ?', request.max_price)
    end 

    @product

Приведенный выше код работает нормально, если запрос имеет либо дату окончания, либо max_price. Если он имеет оба, он выдает ошибку. Есть ли способ построить или объединить два, где заявления. Я не могу сделать

Product.search '*', where('created_at <= ?', request.end_date), where('price <= ?', request.max_price)

потому что, если утверждение важно.

1 ответ

Решение

Вы должны проверить документы Searchkick, он имеет или фильтр: https://github.com/ankane/searchkick

where: {
  expires_at: {gt: Time.now}, # lt, gte, lte also available
  or: [
    [{in_stock: true}, {backordered: true}]
  ]
}

Для вашего случая вы можете разобраться с этим, как показано ниже:

conditions[:or] = [[]]
unless request.end_date.nil?
    conditions[:or][0] += [{created_at: {lt: request.end_date}}]
end 

unless request.max_price.nil?
    conditions[:or][0] += [{price: {lt: request.max_price}}]
end 
Product.search '*', where: conditions
Другие вопросы по тегам