我该怎么办?
myarray = ["name1","name2"]
Product.where('name ILIKE ?', %#{myarray}%)
我需要获取名称为name1
和name2
的所有产品。
这可能吗?
答案 0 :(得分:31)
我想你想用ILIKE
函数测试所有值。
这是在Postgres中完成的:
select * from table where value ilike any (array['%foo%', '%bar%', '%baz%']);
尝试转换为Rails / Ruby语法,如下所示:
myarray_with_percetage_signs = ["name1","name2"].map {|val| "%#{val}%" }
Product.where("name ILIKE ANY ( array[?] )", myarray_with_percetage_signs)
答案 1 :(得分:1)
最近遇到了同样的问题,而且既然没有回答帮助我(我使用的是MySQL数据库),我想我会分享我的解决方案。
如果您有一个小型数据库,并且不介意检索所有产品,则可以使用以下方法从数据库中检索所有产品后进行过滤:
Product.select { |product| myarray.any? { |str| product.name.include? str } }
但是,如果您更喜欢在数据库级别执行查询,则可以先使用WHERE REGEXP
子句将数组转换为以管道分隔的列表:
Product.where("`name` REGEXP '#{Regexp.new(myarray.join('|'))}'")
答案 2 :(得分:-1)
如果你在相等的意义上寻找类似字符串(如SQL中的LIKE 'string'
)where
接受数组值的哈希:
Product.where(name: myarray)
Product.where(name: myarray).to_sql
# => SELECT "products".* FROM "products" WHERE "products"."name" IN ('x', 'y')
但是,如果你想通过子串过滤(比如SQL中的LIKE '%substring%'
),请查看Edgars Jekabsons的答案。
答案 3 :(得分:-6)
Product.where('name IN (?)', myarray)
应该做的伎俩;)