2011-01-21 15 views
10

किसी दिए गए मॉडल विशेषता को रीफ्रेश करने का सबसे अच्छा तरीका क्या है?एक मॉडल विशेषता को दोबारा लोड करें

post.body = Post.find(post.id).body 
एक अच्छे वाक्य रचना के साथ

:

अर्थात, और कार्यात्मक रूप से, मैं इस चाहते हैं। हो सकता है कि

post.reload_body! 

संपादित करें: मैं केवल एक एकल विशेषता (सबको एक साथ नहीं जिम्मेदार बताते हैं)

+0

है क्या आप ताज़ा हो मतलब है एक मॉडल विशेषता? संदर्भ क्या है? – Maz

+0

प्रश्न शीर्षक और सामग्री विवादित हैं। क्या आप केवल निर्दिष्ट विशेषता को रीफ्रेश करना चाहते हैं या क्या उन सभी को रीफ्रेश करना ठीक है? – Heikki

+0

@Heikki: निर्दिष्ट विशेषता (मैंने यह स्पष्ट करने के लिए प्रश्न को अद्यतन किया) –

उत्तर

9

मुझे बीट्स तुम क्यों ऐसा करना चाहते हैं, लेकिन फिर से लोड करना चाहते हैं:

def reload_attribute(attr) 
    value = self.class.where(:id=>id).select(attr).first[attr] 
    self[attr] = value 
end 

यह एक SELECT कि केवल एक कॉलम प्राप्त करता है और वर्तमान मॉडल उदाहरण में विशेषता के अपने मूल्य प्रदान करती जारी करता है। साथ (जैसे) पर कॉल करें:

post = Post.find(1) 
post.reload_attribute(:body) 

सच हालांकि, तो आप सिर्फ post.reload (doc) के साथ जाना चाहिए। जब तक आप बेहद विस्तृत कॉलम कि SELECT * कर रही पर कुछ प्रदर्शन लागत थोपना में रेल

+0

यदि आपके पास (कहें) कस्टम एक्सेसर्स इत्यादि हैं तो यह भी एक समस्या होगी। – Peter

+1

मैं जो केस देखता हूं वह संबंध कैश को साफ़ करने से बचने के लिए है। यदि मैं ऑब्जेक्ट की केवल एक विशेषता को रीफ्रेश करता हूं, तो पहले से लोड किए गए संबंध बाद में एक नया SQL कॉल ट्रिगर नहीं करेंगे। – Mathiou

-1

रेल 4 इस

post.body(reload: true) 

के लिए एक सरल जवाब है है 5.1 इस

post.reload_body 
+0

मुझे नहीं लगता कि यह विशेषताओं के साथ काम कर रहा है, केवल संबंधों के साथ (कम से कम रेल 4 वाक्यविन्यास के लिए)। – Mathiou

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