Wie mache ich eine LIKE-Abfrage in Arel und Rails?

Ich möchte etwas tun wie:

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

Mein Versuch in Arel:

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

Dies wird jedoch:

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

Arel umschließt die Abfragezeichenfolge ‘Smith’ korrekt, aber da dies eine LIKE-statement ist, funktioniert sie nicht.

Wie macht man eine LIKE-Abfrage in Arel?

PS Bonus – Ich versuche tatsächlich, zwei Felder in der Tabelle, Name und Beschreibung, zu scannen, um zu sehen, ob es Übereinstimmungen mit der Abfrage gibt. Wie würde das funktionieren?

   

So führen Sie eine ähnliche Abfrage in arel aus:

 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))) 

Versuchen

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

PS.

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

Aa und es ist eine lange Zeit, aber @ cgg5207 hat eine Änderung hinzugefügt (vor allem nützlich, wenn Sie lange oder mehrere lang benannte Parameter suchen oder Sie sind zu faul beim Tippen)

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

oder

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

Reuben Mallabys Antwort kann weiter verkürzt werden, um Parameterbindungen zu verwenden:

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