私は次のようなことをしたい:
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クエリを実行するにはどうすればよいですか?
追伸ボーナス-実際には、テーブルにある2つのフィールド(名前と説明の両方)をスキャンして、クエリに一致するものがあるかどうかを確認しようとしています。それはどのように機能しますか?
これはarelでlikeクエリを実行する方法です。
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)))
試して
User.where("name like ?", "%#{params[:query]}%").to_sql
PS。
q = "%#{params[:query]}%"
User.where("name like ? or description like ?", q, q).to_sql
Aaandそれは長い時間ですが、@ 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
Reuben Mallabyの答えは、パラメーターバインディングを使用するためにさらに短縮できます。
User.where("name like :kw or description like :kw", :kw=>"%#{params[:query]}%").to_sql