6

私の質問はこれに似ていますが、私の特定の問題に対処する回答はありません。

次のようなオブジェクトを見つけたい:

conditions = {first_name: @search OR last_name: @search}
Stuff.where( conditions )

明らかに、この構文は無効ですが、やりたいことを示す最も簡単な方法です。複合/複合条件でよりクリーンなハッシュ構文を使用したい。

このような「純粋な文字列条件」を使用して手で書き出すことができることは知っていますStuff.where("first_name=#{@search} OR last_name=#{@search}") が、これは私が知りたいことではありません。

更新次のような配列で OR を実行できるようですStuff.where( some_column: ["option1", "option2"])。これは知っておくと非常に便利ですが、別の key=value ペアに適用するには OR が必要なため、問題は解決しません...key=value OR key=valueではありませんkey=value OR value

Update2 SQL文字列を使用したくない理由は、クエリをいくつかの部分に分けて作成する必要があり、挿入された変数をエスケープしながらそれを行う方法がわからないためです。私はテストしていませんが、これはうまくいかないと思います:

conditions = ["(project_id=? AND sent_to_api=1)", @project_id]
conditions = conditions + ["first_name=? OR last_name=?", @search, @search]
Stuff.where( conditions )

うまくいけば、これは理にかなっています。Rails のビルトイン SQL エスケープを維持しながら、SQL 文字列構文で必要なことを行う方法はありますか?

4

5 に答える 5

1

次のような検索フィールド配列があります

search_fields = ['first_name', 'last_name', 'email']

params はコントローラから取得されます

params = {'first_name' => 'abc', 'email' => abc@gmail.com}

search_field_params = params.slice(*search_fields)

query = search_field_params.keys.map{|field| "#{field} = :#{field}" }.join(" OR ")

query_params = search_field_params.symbolize_keys

Stuff.where(user_id: user_id).where(query, query_params)

SELECT * FROM stuffs WHERE user_id = 537 AND (first_name = 'abc' OR email = 'abc@gmail.com')

さらに条件が where で追加されます..

于 2015-05-22T09:10:19.753 に答える
0

これを行うには、次の 3 つの方法しか考えられません。

  1. SQL 文字列 ( を書きます.where('first_name = ? OR last_name = ?', 'foo', 'bar')。これはやりたくないと言っていましたが、まあまあです。

  2. ARELを使用してください。fotanus によってリンクされた質問は、これをカバーしています: ActiveRecord OR query。あなたのコメントは、このオプションも気に入らないことを示唆しています。

  3. クエリの作成には、 Squeelまたは独自の DSL を提供する他の gem を使用します。これにより、クエリを次のように記述できるようになります。

    Stuff.where{(first_name = search) | (last_name = search)}

更新: SQL 文字列の作成に取り組んでいる場合は、いくつかの手順でクエリを作成する方法が頭に浮かびます。これは少し古いように感じます - おそらくもっとエレガントな方法がありますが、うまくいくはずです:

conditions = []
values = []

conditions << 'first_name = ?'
values << 'Bob'

conditions << 'last_name = ?'
values << 'Smith'

#repeat as needed.

Stuff.where(conditions.join(' OR '), values)
于 2013-09-10T15:39:23.487 に答える
-1

メソッドrails 5で条件を書き込むことができるはずです#or

Stuff.where( first_name: @search ).or( Stuff.where( last_name: @search ) )

しかし、古いバージョンのArelテクニックは利用可能です:

condition = Stuff.arel_table[:first_name].eq( @search ).or( Stuff.arel_table[:last_name].eq( @search ) )
Stuff.where( condition )
于 2015-12-02T20:23:58.697 に答える