1

配列の各メンバーが AND された 'like' 操作である配列から where クエリを作成する必要があります。例:

SELECT ... WHERE property like '%something%' AND property like '%somethingelse%' AND ...

ActiveRecord 関数を使用するのは簡単whereですが、最初にサニタイズする方法がわかりません。明らかに、文字列を作成して関数に詰め込むことはできwhereませんが、. を使用して可能な方法はないようです?

ありがとう

4

3 に答える 3

6

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.allq.limit(11)


これがどのように機能するかについての簡単なチュートリアルです。Active Record Query Interface GuideEnumerableドキュメントも確認する必要があります。

一致するものが 2 つ (ab) ある場合は、次のようにすることができます。

q = Model.where('p like ?', "%#{a}%").where('p like ?', "%#{b}%")

このwhereメソッドは、通常のすべてのクエリ メソッドをサポートするオブジェクトを返すためM.where(...).where(...)...、必要に応じて呼び出しを連鎖させることができます。他のクエリ メソッド ( orderlimit、 ... など) は同じ種類のオブジェクトを返すので、それらも連鎖させることができます。

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)
于 2012-05-25T04:58:11.417 に答える
0

配列がmodel_arrayであるとしましょう。配列選択を試してください:

model_array.select{|a|a.property=~/something/ and a.property=~/somethingelse/}

もちろん、任意の正規表現を使用できます。

于 2012-05-25T04:57:37.303 に答える
0

AR を使用している場合は、次のようModel.where(property: your_array)にしModel.where("property in (?)", your_array)ます

于 2012-05-25T04:43:13.787 に答える