एसक्यूएल आज़माएं?
अगर यह सिर्फ एक बयान है, और यह उत्पादन समस्याओं का कारण बन रहा है, तो क्या आप अभी के लिए क्वेरी जेनरेटर को छोड़ सकते हैं? दूसरे शब्दों में, बहुत कम अवधि के लिए, बस स्वयं SQL लिखें। इससे आपको थोड़ा समय लगेगा।
# All on one line:
Artist.find_by_sql
"SELECT `artists`.* FROM `artists`
WHERE `artists`.`id` = #{params[:artist_id].to_i} LIMIT 1"
ARel/MySQL समझाएं?
रेल यह समझाने में मदद कर सकती है कि MySQL क्या करने की कोशिश कर रहा है:
Artist.find(params[:artist_id]).explain
http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/
शायद आप उन प्रश्नों के बीच किसी प्रकार का अंतर खोज सकते हैं जो सफल हो रहे हैं और असफल हो रहे हैं, जैसे कि explain
अनुक्रमणिका या अनुकूलन का उपयोग करता है।
mysql2 रत्न?
क्या आप MySQL मणि से mysql2 मणि में बदलने का प्रयास कर सकते हैं? जब आप mysql2 रत्न पर स्विच करते हैं तो आपको क्या विफलता मिलती है?
अस्थिरता?
शायद कुछ और है जो फ्लाई पर पैरा हैश बदल रहा है, इसलिए जब आप इसे प्रिंट करते हैं तो आप इसे देखते हैं, लेकिन जब तक क्वेरी चलती है तब तक यह बदल जाता है?
जैसे ही आप पैरामीटर प्राप्त करते हैं, वेरिएबल असाइन करने का प्रयास करें:
artist_id = params[:artist_id]
... whatever code here...
@artist = Artist.find(artist_id)
पैरा हैश नहीं?
आपने लिखा "मतलब रेल पैराम्स में नहीं गुजर रहा है [:artist_id] जो स्पष्ट रूप से पैरा हैश में है।" मुझे नहीं लगता कि यह समस्या है-- मुझे उम्मीद है कि आप इसे देख रहे हैं क्योंकि रेल "?" तैयार विवरण के लिए प्लेसहोल्डर के रूप में।
पता लगाने के लिए, @Mori द्वारा सुझाए गए आदेशों को चलाएँ और उनकी तुलना करें; वे एक जैसे होने चाहिए।
Article.find(42).to_sql
Article.find(params[:artist_id]).to_sql
तैयार किए गए कथन?
एक तैयार स्टेटमेंट कैश समस्या हो सकती है, जब क्वेरी वास्तव में निष्पादित की जाती है।
यह रहा वह कोड जो विफल हो रहा है-- और एक बड़ी मोटी चेतावनी है।
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
तैयार किए गए कथनों को बंद करने के लिए अपने डेटाबेस को कॉन्फ़िगर करने का प्रयास करें, यह देखने के लिए कि क्या इससे कोई फर्क पड़ता है।
आपके ./config/database.yml
. में फ़ाइल:
production:
adapter: mysql
prepared_statements: false
...
तैयार बयानों के साथ बग?
इस सेटिंग को अनदेखा करने वाले रेल के साथ कोई समस्या हो सकती है। यदि आप इसके बारे में और अधिक जानना चाहते हैं, तो जेरेमी कोल और आरोन द्वारा यह चर्चा और बग फिक्स देखें:https://github.com/rails/rails/pull/7042
हेरोकू सेटिंग को अनदेखा कर सकता है। यहां एक तरीका है जिससे आप तैयार_स्टेटमेंट सेटअप को पैच करके हेरोकू को ओवरराइड करने का प्रयास कर सकते हैं:https://github.com /रेल/रेल/मुद्दे/5297
क्वेरी कैश निकालें?
यह देखने के लिए कि क्या इससे कोई फर्क पड़ता है, ActiveRecord QueryCache को निकालने का प्रयास करें:
config.middleware.delete ActiveRecord::QueryCache
http://edgeguides.rubyonrails.org/configuring.html#configuring-middle
पोस्टग्रेज आज़माएं?
यदि आप Postgres आज़मा सकते हैं, तो यह इसे भी साफ़ कर सकता है। यह आपके लिए दीर्घकालिक समाधान नहीं हो सकता है, लेकिन यह समस्या को MySQL से अलग कर देगा।