我正在列出产品,我希望能够将哈希作为我的where子句传递给我,所以我可以做类似的事情:
filter = {}
filter[:category_id] = @category.id
filter[:is_active] = true
@products = Products.where(filter)
有可能以某种方式这样做吗?
我还需要在where子句中添加类似的内容:
WHERE price > 100
如何将其添加到过滤器?
我想这样做的原因是因为在UI中我将有一组可选的过滤器,因此我将使用控制器中的if子句来设置每个过滤器。
答案 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