如何为where子句传递哈希值?

时间:2015-07-01 17:12:42

标签: ruby-on-rails

我正在列出产品,我希望能够将哈希作为我的where子句传递给我,所以我可以做类似的事情:

filter = {}
filter[:category_id] = @category.id
filter[:is_active] = true

@products = Products.where(filter)

有可能以某种方式这样做吗?

我还需要在where子句中添加类似的内容:

WHERE price > 100

如何将其添加到过滤器?

我想这样做的原因是因为在UI中我将有一组可选的过滤器,因此我将使用控制器中的if子句来设置每个过滤器。

2 个答案:

答案 0 :(得分:3)

您可以将哈希传递给where,就像您一样:

filter = {
  category_id: @category_id,
  is_active: true
}

@products = Product.where(filter)

使用哈希仅适用于相等(例如category_id = 123),因此您不能在其中放置price > 100之类的内容。要添加该条件,只需在链中添加另一个where

@product = Product.where(filter).where('price > 100')

或者...

@product = Product.where(filter)

if params[:min_price]
  @product = @product.where('price > ?', min_price)
end

答案 1 :(得分:0)

您可以从范围中获得一些乐趣:编写一个实际上是一个小型谓词构建器的范围,清理和模式匹配字符串,并将其他标量类型委托给标准谓词构建器。例如

# app/models/concerns/searchable.rb
module Searchable
  extend ActiveSupport::Concern

  included do
    scope :search, ->(params) {
      params.inject(self) do |rel, (key, value)|
        next rel if value.blank?
        case value
        when String
          rel.where arel_table[key].matches '%%%s%%' % sanitize_sql_like(value)
        when Range, Numeric, TrueClass, FalseClass
          rel.where key => value
        else
          raise ArgumentError, "unacceptable search type"
        end
      end
    }
  end
end

# app/models/product.rb
class Product < ApplicationRecord
  include Searchable

然后你可以

filter = { name: 'cheese', description: 'aged', age: 42.. }

Product.search(filter) #=> SELECT "products".* FROM products WHERE "products"."name" ILIKE '%cheese%' AND "products"."description" ILIKE '%aged%' AND "products"."age" >= 42