मैं अपने एसोसिएशन के साथ एक ActiveRecord को कैश करने की कोशिश कर रहा हूं। समस्या पुनर्प्राप्त रिकॉर्ड पर एसोसिएशन तक पहुंचने पर डेटाबेस क्वेरी है।कैशिंग सीमित एसोसिएशन
आम तौर पर, मैं केवल उत्सुक लोडिंग Rails.cache.write('post', Post.includes(:comments).find(99))
के साथ कैश करता हूं। ऐसा लगता है, लेकिन समस्या यह है कि मैं केवल एसोसिएशन के सीमित सबसेट को कैश करना चाहता हूं, और उत्सुक लोडिंग के दौरान सीमाएं अनदेखा की जाती हैं (उदाहरण के लिए here का उल्लेख किया गया है)। तो Post.includes(:popular_comments).find(99)
सभी टिप्पणियां, केवल लोकप्रिय लोगों को नहीं लौटाएगा।
तो मैं आलसी लोड संघ के बाद वस्तु कैशिंग की कोशिश की है, लेकिन जब बाहर वस्तुओं खींच एक प्रश्न दुर्भाग्य से होती है:
class Post < ActiveRecord::Base
has_many :comments
has_many :popular_comments, :class_name > 'Comment', :limit => 20, :order => :votes
post = Post.find(99)
post.popular_comments # lazy-load limited associations
Rails.cache.write('post', post)
...
Rails.cache.read('post').popular_comments # Unwanted SQL query :(
मैं बजाय एक क्लोन कैशिंग की कोशिश की है, एक ही अवांछित SQL क्वेरी । और मैंने रेडिस और memcached कार्यान्वयन दोनों के साथ यह कोशिश की है, एक ही परिणाम। विचित्र रूप से, यह अनुक्रम कंसोल afaict पर काम करता है, लेकिन एक नियंत्रक में एक सरल उपयोग या ऊपर की तरह दृश्य विफल रहता है (यानी एसक्यूएल होता है)।
अद्यतन (अप्रैल 2017): अब मैं कहूंगा कि यह एक मूर्ख आधार है। पूरी वस्तुओं को कैशिंग करना आम तौर पर अपर्याप्त होता है क्योंकि यह बहुत सारे कैश स्टोरेज का उपयोग करता है और यह धारावाहिक/deserialise करने के लिए धीमा है। कैशिंग एसोसिएशन भी (जैसा कि इस प्रश्न में पूछा गया है) एन द्वारा बर्बाद कर रहा है। आमतौर पर कच्चे आईडी और एचटीएमएल टुकड़े को कैश करने के लिए यह अधिक कुशल है।
रेल के कौन से संस्करण आप चल रहे हैं? – Brandan
@ ब्रैंडन यह रेल पर है 3.1 – mahemoff
क्या आप लॉग का एक स्निपेट पोस्ट कर सकते हैं जो दिखा रहा है कि SQL क्या निष्पादित हो रहा है और अनुरोध में यह कहां हो रहा है? मैं इसे पुन: पेश नहीं कर सका। – Brandan