मेरे पास 2 रेल मॉडल हैं: पुस्तक और श्रेणी, जहां एक पुस्तक belongs_to
एक श्रेणी है, एक श्रेणी has_many
पुस्तकें।रेल में लापता स्पर्श विकल्प है_मेनी रिलेशन
श्रेणी का नाम प्रत्येक पुस्तक के पृष्ठ में दिखाया गया है, और पृष्ठ कैश किए गए हैं।
यदि मैं एक श्रेणी का नाम बदलता हूं (कहें, 'विज्ञान फाई' से 'विज्ञान कथा' तक), तो सभी संबंधित पुस्तक पृष्ठ पुराने होंगे, और HTML पुनर्जन्म को ट्रिगर करने के लिए पुस्तकों को "स्पर्श" करने की आवश्यकता है।
यह भावना करने के लिए सक्षम होने के लिए बनाने के लिए प्रतीत होता है:
class Category << ActiveRecord::Base
has_many :books, touch: true
end
लेकिन the option is unavailable, मुझे लगता है क्योंकि touch
तंत्र प्रत्येक वस्तु है, जो has_many
रिश्तों के लिए एक प्रमुख प्रदर्शन हिट हो सकती थी दृष्टांत होगा।
कि बचने के लिए, मैं कच्चे एसक्यूएल उपयोग कर रहा हूँ इस प्रकार है:
class Category << ActiveRecord::Base
has_many :books
after_update -> {
ActiveRecord::Base.connection.execute "UPDATE books SET updated_at='#{current_time_string}' WHERE category_id=#{id})"
}
end
जो काफी भयानक है। क्या कोई बेहतर तरीका है?
आप दोनों गिनती पर सही हैं: 1) जब कोई श्रेणी बदलती है तो मुझे सभी पुस्तकों को बदलने की ज़रूरत होती है; 2) update_all अधिक सरल है और मॉडल को तुरंत चालू नहीं करता है; डीबी को सीधे भेजा गया SQL क्वेरी प्रदर्शन समस्याओं से बचाती है। – Giuseppe
लेकिन क्या यह कैश अपडेट ट्रिगर करेगा? – user1262904