LIKE パターンを作成する最も簡単な方法は、文字列補間です。
where('property like ?', "%#{str}%")
すべての文字列が配列にある場合は、ActiveRecord のクエリ チェーンを使用inject
して、最終的なクエリを作成できます。
a = %w[your strings go here]
q = a.inject(YourModel) { |q, str| q.where('property like ?', "%#{str}%") }
その後、最終結果を得るために必要なことは何でもできますq.all
。q.limit(11)
これがどのように機能するかについての簡単なチュートリアルです。Active Record Query Interface GuideとEnumerable
ドキュメントも確認する必要があります。
一致するものが 2 つ (a
とb
) ある場合は、次のようにすることができます。
q = Model.where('p like ?', "%#{a}%").where('p like ?', "%#{b}%")
このwhere
メソッドは、通常のすべてのクエリ メソッドをサポートするオブジェクトを返すためM.where(...).where(...)...
、必要に応じて呼び出しを連鎖させることができます。他のクエリ メソッド ( order
、limit
、 ... など) は同じ種類のオブジェクトを返すので、それらも連鎖させることができます。
M.where(...).limit(11).where(...).order(...)
LIKE 対象の配列がありwhere
、モデル クラスに適用where
してから、それが返すものに適用し、配列を使い切るまでもう一度適用します。フィードバック ループのように見えるものinject
( reduce
「map-reduce」名声からの別名)が必要になる傾向があります。
注入(初期){| メモ、obj | ブロック } → obj
メソッドまたは演算子を指定するブロックまたはシンボルで指定された二項演算を適用して、enumのすべての要素を結合します。
ブロックを指定すると、 enumの各要素に対してブロックにアキュムレータ値 ( memo ) が渡され、要素 [...] の結果がmemoの新しい値になります。反復の最後に、memoの最終値がメソッドの戻り値になります。
したがってinject
、ブロックの出力 (この場合は の戻り値where
) を取得し、それをブロックの次の実行への入力としてフィードします。アレイがあり、そのinject
上にいる場合:
a = [1, 2, 3]
r = a.inject(init) { |memo, n| memo.m(n) }
それはこれと同じです:
r = init.m(1).m(2).m(3)
または、擬似コードで:
r = init
for n in a
r = r.m(n)