我有一个变量str,它包含一个像The ruby
这样的字符串,它会根据它找到结果。
User.where('abc LIKE :q OR xyz LIKE :q ', q: "%#{str}%")
虽然它工作正常,但如果str变量包含一个像str = [“The”,“ruby”]
这样的数组,我会坚持做什么我可以运行一个循环,但它会创建多个查询,我不想要那个。可以用相同的代码完成吗?
我知道如果我必须测试多个单词,那么我必须做这样的事情
User.where('abc LIKE :q OR abc LIKE :r OR xyz LIKE :q OR xyz LIKE :r ', q: "%#{str[0]}%", r: "%#{str[1]}%")
例如,我在数组中使用了2个值,但实际上它可以是任意长度。
如果我做得对,请告诉我
答案 0 :(得分:1)
正如您最初的想法,您可以只创建一个循环来创建多个查询。您不需要单独运行查询,但是,您可以使用or
将它们连接到单个SQL语句中:
examples = ['The Ruby', ['The', 'Ruby']]
examples.each do |search|
queries = Array(search).map do |search_term|
User.where('category_title LIKE :q OR title LIKE :q OR description LIKE :q OR tag_list LIKE :q', q: "%#{search_term}%")
end
statement = queries.reduce do |statement, query|
statement.or(query)
end
puts statement.to_sql
end
那个的输出是(当然要清理一下):
SELECT "users".* FROM "users"
WHERE (category_title LIKE '%The Ruby%' OR title LIKE '%The Ruby%'
OR description LIKE '%The Ruby%' OR tag_list LIKE '%The Ruby%')
SELECT "users".* FROM "users"
WHERE ((category_title LIKE '%The%' OR title LIKE '%The%' OR
description LIKE '%The%' OR tag_list LIKE '%The%') OR
(category_title LIKE '%Ruby%' OR title LIKE '%Ruby%' OR
description LIKE '%Ruby%' OR tag_list LIKE '%Ruby%'))
答案 1 :(得分:1)
很抱歉,如果这个答案被认为有点偏离主题,但是有更有效的方法来查询OP要求的信息,而不是通过强制执行此操作并将大量LIKE查询链接在一起。
您使用的是哪个数据库引擎,@ Raaz?多个令牌听起来像是基于POSIX正则表达式的查询的一个很好的用例。与仅一次搜索1个令牌的LIKE查询相比,使用模式匹配将允许您在仅具有少量WHERE子句的单个查询中搜索任意数量的令牌。
对于Postgres,它看起来像这个未经证实的代码片段:
Video.where("category_title SIMILAR TO '%(the|ruby)%'"
另一个假设您正在使用Postgres的选项是使用pg_search gem并对您的数据库执行multisearchable搜索。您可以一次查询这四个字段,数据库将完成所有繁重的工作。同样,这假设您正在使用Postgres数据库。
答案 2 :(得分:0)
您可以使用ILIKE
进行简单查询来实现此目的str = ["The","Ruby"].map {|val| "%#{val}%" }
Video.where("category_title ILIKE ANY ( array[?] ) OR title ILIKE ANY (array[?] ) OR description ILIKE ANY (array[?] ) OR tag_list ILIKE ANY (array[?] )", str, str, str, str)
它为我工作。
干杯!