Rails里面有LIKE和数组

时间:2013-10-16 19:58:06

标签: ruby-on-rails activerecord

我该怎么办?

myarray = ["name1","name2"]
Product.where('name ILIKE ?', %#{myarray}%)

我需要获取名称为name1name2的所有产品。

这可能吗?

4 个答案:

答案 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)

应该做的伎俩;)