我想使用包含在字段中的多个关键字的activerecord(而不是rails)进行查询(所以我必须使用LIKE)但我事先并不知道会有多少个关键字。
我的查询看起来像这样,Word就是我的模特。
query = ['word1','word2'] #could be more
puts "searching for #{query}"
qwords = Word.none
query.each do |qword|
puts qwords.where("word like ?", "%#{qword}%").to_sql
qwords = qwords.where("word like ?", "%#{qword}%")
end
什么都没有,因为查询被添加为AND但我需要OR。
searching for ["word1", "word2"]
SELECT "words".* FROM "words" WHERE (word like '%word1%')
SELECT "words".* FROM "words" WHERE (word like '%word1%') AND (word like '%word2%')
#<ActiveRecord::Relation []>
我无法使用使用sql IN关键字的Word.where(word: query)
,因为这仅适用于完全匹配。
是否有一个解决方案并不涉及连接所需的整个SQL?
答案 0 :(得分:1)
query = "word1 word2" #could be more
puts "searching for #{query}"
query_length = query.split.length #calculates number of words in query
现在,无论查询中的关键字数量是多少,您都可以将所需的SQL查询数量放在一起
Word.where([(['word LIKE ?'] * query_length).join(' OR ')] + (query.split.map {|query| "%#{query}%"}))
这应该返回
["word LIKE ? OR word LIKE ?", "%word1%", "%word2%"]
用于SQL搜索
答案 1 :(得分:1)
忘了这个问题,然后自己找到了解决方案。 我现在做以下事情。这个问题是由于使用结果集进行下一次查询而导致的,因为它在整个记录集上并且结果被添加。
@qwords = Word.none
$query.each do |qword|
@qwords += Word.where(word: qword)
end