Saya ingin melakukan sesuatu seperti:
SELECT * FROM USER WHERE NAME LIKE '%Smith%';
Upaya saya di Arel:
# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql
Namun, ini menjadi:
SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';
Arel membungkus string kueri 'Smith' dengan benar, tetapi karena ini adalah pernyataan LIKE, ini tidak berfungsi.
Bagaimana cara melakukan query LIKE di Arel?
Bonus PS - Saya sebenarnya mencoba memindai dua bidang pada tabel, nama dan deskripsi, untuk melihat apakah ada kecocokan dengan kueri. Bagaimana cara kerjanya?
ruby-on-rails
activerecord
arel
filsa
sumber
sumber
Jawaban:
Beginilah cara Anda melakukan kueri serupa di arel:
PS:
sumber
where("name like ?", ...)
, pendekatan ini lebih portabel di berbagai database. Misalnya, ini akan mengakibatkanILIKE
digunakan dalam kueri terhadap Postgres db.User.where(users[:name].matches("%#{params[:user_name]}%"))
,, saya mencobaTRUNCATE users;
dan pertanyaan lain seperti itu dan tidak ada yang terjadi di sisi sql. Tampak aman bagi saya..gsub(/[%_]/, '\\\\\0')
untuk keluar dari karakter wildcard MySql.Mencoba
PS.
Aaand sudah lama tetapi @ cgg5207 menambahkan modifikasi (sangat berguna jika Anda akan mencari parameter dengan nama lama atau beberapa nama lama atau Anda terlalu malas untuk mengetik)
atau
sumber
%
dalam string yang diganti? Sepertinya jika Anda hanya menginginkan wildcard satu sisi, tidak ada yang menghentikan pengguna untuk mengirimkan nilai kueri yang mencakup%
di kedua ujungnya (saya tahu bahwa dalam praktiknya, Rails mencegah%
agar tidak muncul dalam string kueri, tetapi sepertinya di sana harus menjadi perlindungan terhadap ini di level ActiveRecord).to_sql
atau arel manager, bagaimana cara menjalankan sql pada db?Jawaban Reuben Mallaby dapat dipersingkat lebih lanjut untuk menggunakan pengikatan parameter:
sumber