Saya mencoba melakukan kueri yang mirip seperti itu
def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search], order => 'name'
end
Tetapi ketika dijalankan sesuatu menambahkan tanda kutip yang menyebabkan pernyataan sql keluar seperti itu
SELECT COUNT(*)
FROM "schools"
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):
Jadi Anda bisa melihat masalah saya. Saya menggunakan Rails 4 dan Postgres 9 yang keduanya belum pernah saya gunakan jadi tidak yakin apakah itu dan hal activerecord atau mungkin hal postgres.
Bagaimana saya bisa mengatur ini jadi saya punya seperti '%my_search%'
pada permintaan akhir?
sql
ruby-on-rails
ruby
postgresql
activerecord
Harry Forbess
sumber
sumber
search
senar itu sudah bersih??
di mana akan mengurus sanitasi%
dan_
di dalamsearch
tidak akan disanitasi, di bawah pendekatan ini.Alih-alih menggunakan
conditions
sintaks dari Rails 2, gunakanwhere
metode Rails 4 sebagai gantinya:CATATAN: di atas menggunakan sintaks parameter bukan? placeholder: keduanya harus menghasilkan sql yang sama.
CATATAN: menggunakan
ILIKE
nama LIKE - versi postgres case sensitif dari LIKEsumber
Movie.where("title ILIKE :s", s: search_string)
akan diterjemahkanSELECT 1 AS one FROM "movies" WHERE (title ILIKE 'test') LIMIT $1
oleh ActiveRecord (Rails 5.1.6) - harap perhatikan bahwa tidak ada simbol persentase setelah ILIKE)search_string
variabel. Saya pikirSELECT 1 AS one
output hanya di konsol rel atau Anda gunakanlimit(1)
? FYI: Rails 5.1.6 memiliki masalah keamanan, gunakan 5.1.6.2 atau 5.1.7 sebagai gantinyaMeskipun interpolasi string akan berfungsi, karena pertanyaan Anda menentukan rel 4, Anda bisa menggunakan Arel untuk ini dan menjaga agnostik basis data aplikasi Anda.
sumber
ActiveRecord cukup pintar untuk mengetahui bahwa parameter yang dirujuk oleh
?
adalah string, dan dengan demikian membungkusnya dalam tanda kutip tunggal. Anda bisa sebagai satu posting menyarankan menggunakan interpolasi string Ruby untuk mengisi string dengan%
simbol yang diperlukan . Namun, ini bisa membuat Anda terkena SQL-injection (yang buruk). Saya sarankan Anda menggunakanCONCAT()
fungsi SQL untuk mempersiapkan string seperti:"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)
sumber
%
ditambahkan / ditambahkan atau tidak). Entah itu berfungsi seperti yang diharapkan atau rel memiliki bug utama yang mempengaruhi kedua kasus.Mencoba
Lihat dokumen tentang kondisi AREL untuk info lebih lanjut.
sumber
sumber