Come fare una query LIKE in Arel e Rails?

Voglio fare qualcosa come:

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

Il mio tentativo in Arel:

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

Tuttavia, questo diventa:

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

Arel avvolge correttamente la stringa di query “Smith”, ma poiché questa è un’istruzione LIKE, non funziona.

Come si fa una query LIKE in Arel?

Bonus PS – In realtà sto provando a scansionare due campi sul tavolo, sia il nome che la descrizione, per vedere se ci sono corrispondenze alla query. Come funzionerebbe?

Ecco come si esegue una query simile in 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))) 

Provare

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

PS.

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

E ‘passato molto tempo, ma @ cgg5207 ha aggiunto una modifica (utile soprattutto se stai andando a cercare nomi lunghi o più parametri con nomi lunghi o sei troppo pigro per scrivere)

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

o

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

La risposta di Reuben Mallaby può essere abbreviata ulteriormente per utilizzare i binding di parametri:

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