2015-10-29 4 views
6

मेरे पास 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 

जो काफी भयानक है। क्या कोई बेहतर तरीका है?

उत्तर

5

आप has_many एसोसिएशन पर उपयोग नहीं कर सकते हैं, यह केवल belongs_to के साथ काम करता है, यह एक तथ्य है।

यदि मैं सही ढंग से समझता हूं कि आप क्या चाहते हैं, तो पुस्तक मॉडल में touch:true के साथ उत्तर नहीं काम करेंगे, क्योंकि जब आप श्रेणी मॉडल बदलते हैं तो पुस्तक ऑब्जेक्ट अपडेट नहीं किया जाएगा और दृश्य पुन: उत्पन्न नहीं होगा।

तो मुझे लगता है कि आपका समाधान इसके लिए सबसे अच्छा है। (आप books.update_all(updated_at: Time.now) का भी उपयोग कर सकते हैं)

+1

आप दोनों गिनती पर सही हैं: 1) जब कोई श्रेणी बदलती है तो मुझे सभी पुस्तकों को बदलने की ज़रूरत होती है; 2) update_all अधिक सरल है और मॉडल को तुरंत चालू नहीं करता है; डीबी को सीधे भेजा गया SQL क्वेरी प्रदर्शन समस्याओं से बचाती है। – Giuseppe

+0

लेकिन क्या यह कैश अपडेट ट्रिगर करेगा? – user1262904

0

वास्तव में ActiveRecord में संबंधों के लिए एक स्पर्श विकल्प है। वाक्य रचना अपने की उम्मीद के साथ फर्क सिर्फ इतना है कि यह belongs_to के लिए एक विकल्प है:

class Book << ActiveRecord::Base 
    belongs_to :categories, touch: true 
end 

प्रलेखन: http://apidock.com/rails/ActiveRecord/Persistence/touch

+1

सबसे पहले, सम्मेलन द्वारा इसे 'श्रेणी' (एकवचन) होना चाहिए। जो कुछ करेगा वह उस श्रेणी को अपडेट करेगा जब कोई पुस्तक बनाई/बदली जाती है, जो कि मुझे जो चाहिए, उसके विपरीत है, यानी जब माता-पिता बदलते हैं तो सभी बच्चों को स्पर्श करें। – Giuseppe

0

यह belongs_to विधि है जो अपनी पुस्तकों मॉडल में होना चाहिए पर ही उपलब्ध है। तो आप अभी भी इसका इस्तेमाल कर सकते हैं।

+0

लॉल, एक ही समय में उत्तर दिया, दूसरे जवाब में बेहतर स्पष्टीकरण है :)। –

+0

धन्यवाद दोस्त: पी – Caillou

संबंधित मुद्दे