在Activerecord和Ruby中将where语句与OR结合使用

时间:2015-04-03 13:38:14

标签: ruby activerecord

我想使用包含在字段中的多个关键字的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?

2 个答案:

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