2015-04-03 32 views
0

我想用activerecord(而不是rails)與一個字段中包含多個關鍵字(所以我必須使用LIKE)做一個查詢,但我不知道在推進將會有多少關鍵字。多個where語句結合OR在Activerecord和紅寶石

我的查詢看起來像這樣,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 []> 

我不能使用Word.where(word: query)它使用SQL IN關鍵字,因爲只對完全匹配。

是否有解決方案不涉及連接所需的整個SQL?

+0

請原諒我的無知,但'Word.none'是什麼?我以前沒見過。 – Beartech 2015-04-03 15:25:52

+0

你見過這個頁面嗎?看起來像使用.to_sql專門處理一系列術語的方法。 https://coderwall.com/p/dgv7ag/or-queries-with-arrays-as-arguments-in-rails-4它還鏈接回舊的SO問題,指導OP考慮AREL。 – Beartech 2015-04-03 15:32:51

+0

@Beartech:與.all相反,在這裏使用它,這樣我就可以將關係排列在一起,從空的開始,你會輕易地用Arel解決方案以我的代碼爲例作答案嗎? – peter 2015-04-03 15:57:43

回答

1

已經忘記了這個問題,然後自己找到了解決辦法。 我現在執行以下操作。這個問題是由於使用結果集來完成我的下一個查詢而造成的,因爲它在整個記錄集上並添加了結果。

@qwords = Word.none 
    $query.each do |qword| 
    @qwords += Word.where(word: qword) 
    end 
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}%"})) 

這應該爲你的SQL搜索

返回

["word LIKE ? OR word LIKE ?", "%word1%", "%word2%"] 

+0

不壞,但看看我自己的解決方案,這是更簡單 – peter 2015-05-20 08:07:54