これにはArel
を使用することをお勧めします。 Arel
は、rails/activerecord(新しい依存関係はありません)の基礎となるクエリアセンブラであり、複雑なクエリを構築する際に非常に便利です。これは、上位レベルActiveRecord::QueryMethods
よりはるかに深いものです。
Arel
は、あなたのケースではmatches_any
とmatches_all
を含む多くの予測マッチャーを提供しています。これらのメソッドは、Array
をString
sとし、Like
を使用して個々の検索条件に分割します。例のいずれかのワードを含むすべての候補を検索するために
あなたが使用することができます検索:
class Candidate < ActiveRecord::Base
def self.search_for(term)
candidates = Candidate.arel_table
where(
candidates[:title].lower.matches_any(
term.split.map { |t| "%#{t.downcase}%" }
)
)
end
end
search_for
の最終結果(「ホワイトスツールバー」の検索用語を与えられた)は、次のとおりです。
SELECT [candidates].*
FROM [candidates]
WHERE (
LOWER([candidates].[title]) LIKE '%white%'
OR LOWER([candidates].[title]) LIKE '%stool%'
OR LOWER([candidates].[title]) LIKE '%bar%')
あなたが探しているもののようです。それはすべての条件に一致しなければならない場合は、代わりになりますどのmatches_all
を使用することができます。
SELECT [candidates].*
FROM [candidates]
WHERE (
LOWER([candidates].[title]) LIKE '%white%'
AND LOWER([candidates].[title]) LIKE '%stool%'
AND LOWER([candidates].[title]) LIKE '%bar%')
See Hereを利用可能なすべてのArel
predicationsため。
これには、SQLインジェクションなどを避けるための基本的なエスケープ機能が追加されました。
どのDBを使用していますか? – Gerry
それは助けになるかもしれません - MySQL – Mark