coba sql?
Jika hanya satu pernyataan ini, dan itu menyebabkan masalah produksi, dapatkah Anda mengabaikan generator kueri untuk saat ini? Dengan kata lain, untuk jangka yang sangat pendek, cukup tulis SQL sendiri. Ini akan memberi Anda sedikit waktu.
# All on one line:
Artist.find_by_sql
"SELECT `artists`.* FROM `artists`
WHERE `artists`.`id` = #{params[:artist_id].to_i} LIMIT 1"
Arel/MySQL jelaskan?
Rails dapat membantu menjelaskan apa yang coba dilakukan MySQL:
Artist.find(params[:artist_id]).explain
http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/
Mungkin Anda dapat menemukan beberapa perbedaan antara kueri yang berhasil vs. gagal, seperti cara explain
menggunakan indeks atau pengoptimalan.
permata mysql2?
Bisakah Anda mencoba mengubah dari permata mysql ke permata mysql2? Kegagalan apa yang Anda dapatkan saat beralih ke permata mysql2?
volatilitas?
Mungkin ada hal lain yang mengubah hash params dengan cepat, jadi Anda melihatnya saat mencetaknya, tetapi berubah saat kueri dijalankan?
Coba tetapkan variabel segera setelah Anda menerima parameter:
artist_id = params[:artist_id]
... whatever code here...
@artist = Artist.find(artist_id)
bukan hash params?
Anda menulis "Arti Rails tidak lewat di params[:artist_id] yang jelas-jelas ada di hash params." Saya rasa bukan itu masalahnya-- Saya berharap Anda melihat ini karena Rails menggunakan "?" sebagai pengganti untuk pernyataan yang disiapkan.
Untuk mengetahuinya, jalankan perintah yang disarankan oleh @Mori dan bandingkan; mereka harus sama.
Article.find(42).to_sql
Article.find(params[:artist_id]).to_sql
pernyataan yang sudah disiapkan?
Bisa menjadi masalah cache pernyataan yang disiapkan, ketika kueri benar-benar dieksekusi.
Ini kode yang gagal-- dan ada peringatan besar.
begin
stmt.execute(*binds.map { |col, val| type_cast(val, col) })
rescue Mysql::Error => e
# Older versions of MySQL leave the prepared statement in a bad
# place when an error occurs. To support older mysql versions, we
# need to close the statement and delete the statement from the
# cache.
stmt.close
@statements.delete sql
raise e
end
Coba konfigurasikan database Anda untuk menonaktifkan pernyataan yang sudah disiapkan, untuk melihat apakah ada perbedaan.
Di ./config/database.yml
. Anda berkas:
production:
adapter: mysql
prepared_statements: false
...
bug dengan pernyataan yang sudah disiapkan?
Mungkin ada masalah dengan Rails yang mengabaikan pengaturan ini. Jika Anda ingin tahu lebih banyak tentangnya, lihat diskusi dan perbaikan bug ini oleh Jeremey Cole dan Aaron:https://github.com/rails/rails/pull/7042
Heroku mungkin mengabaikan pengaturan. Berikut cara Anda dapat mencoba mengganti Heroku dengan menambal penyiapan ready_statements:https://github.com /rails/rails/issues/5297
hapus cache kueri?
Coba hapus ActiveRecord QueryCache untuk melihat apakah itu membuat perbedaan:
config.middleware.delete ActiveRecord::QueryCache
http://edgeguides.rubyonrails.org/configuring.html#configuring-middle
coba postgres?
Jika Anda dapat mencoba Postgres, itu juga dapat menghapusnya. Itu mungkin bukan solusi jangka panjang untuk Anda, tetapi itu akan mengisolasi masalah ke MySQL.