121

私は次のようなことをしたい:

SELECT * FROM USER WHERE NAME LIKE '%Smith%';

アレルでの私の試み:

# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql

ただし、これは次のようになります。

SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';

Arelはクエリ文字列'Smith'を正しくラップしますが、これはLIKEステートメントであるため、機能しません。

ArelでLIKEクエリを実行するにはどうすればよいですか?

PSボーナス-私は実際にテーブルの2つのフィールド(名前と説明の両方)をスキャンして、クエリに一致するものがあるかどうかを確認しようとしています。それはどのように機能しますか?

4

4 に答える 4

287

これは、arelで同様のクエリを実行する方法です。

users = User.arel_table
User.where(users[:name].matches("%#{user_name}%"))

PS:

users = User.arel_table
query_string = "%#{params[query]}%"
param_matches_string =  ->(param){ 
  users[param].matches(query_string) 
} 
User.where(param_matches_string.(:name)\
                       .or(param_matches_string.(:description)))
于 2011-08-10T14:46:48.450 に答える
117

試す

User.where("name like ?", "%#{params[:query]}%").to_sql

PS。

q = "%#{params[:query]}%"
User.where("name like ? or description like ?", q, q).to_sql

ああ、久しぶりですが、@ cgg5207が変更を追加しました(長い名前のパラメーターまたは複数の長い名前のパラメーターを検索する場合、または入力するのが面倒な場合に最も便利です)

q = "%#{params[:query]}%"
User.where("name like :q or description like :q", :q => q).to_sql

また

User.where("name like :q or description like :q", :q => "%#{params[:query]}%").to_sql
于 2010-12-13T15:49:40.580 に答える
3

Reuben Mallaby の回答は、パラメーター バインディングを使用するためにさらに短縮できます。

User.where("name like :kw or description like :kw", :kw=>"%#{params[:query]}%").to_sql
于 2014-01-08T12:54:17.563 に答える