2012-03-22 15 views
10

रेल पर रूबी के लिए नोब सवाल- यहां मेरी स्थिति का एक उदाहरण है: यदि मेरे पास मॉडल circle है और radius विशेषता है, तो मैं circumference के लिए गणना कहां करूं? क्या यह मॉडल या नियंत्रक में होगा, और यह कैसा दिख सकता है? circumference को मेरे views में पहुंच योग्य होने की आवश्यकता होगी।रेल - मुझे व्युत्पन्न विशेषताओं की गणना कहां करनी चाहिए?

साथ ही, क्या मैं यह सोचने में सही होगा कि मुझे circumference को मेरे मॉडल/डेटाबेस का हिस्सा बनाने की आवश्यकता नहीं है क्योंकि इसे उपयोगकर्ता-इनपुट radius से लिया जा सकता है?

उत्तर

14

व्युत्पन्न विशेषता की गणना करने के लिए तर्क मॉडल में बिल्कुल संबंधित है। परिधि सर्कल की एक संपत्ति है, इस बात की कोई चिंता नहीं कि आप इसे वेब इंटरफ़ेस में कैसे पेश कर रहे हैं।

निम्नलिखित जैसे कहीं से भी परिधि तक पहुँचने के लिए, बस वर्ग पर एक विधि को परिभाषित, आदेश में:

require 'mathn' 
class Circle < ActiveRecord::Base 
    # assume `radius` column exists in the database 

    def circumference 
    Math::PI * 2 * radius 
    end 
end 

चूंकि यह परिधि की गणना करने के लिए बहुत सस्ते computationally है, तो आप सिर्फ यह गणना कर सकते हैं के रूप में की जरूरत है । अगर यह कुछ है कि और अधिक जटिल गणना है कि आप एक से अधिक बार चलाने के लिए नहीं करना चाहता था शामिल थे, तो आप इसे इस प्रकार memoize सकता है:

def circumference 
    @circumference ||= Math::PI * 2 * radius 
end 

कि @circumference उदाहरण चर पहली बार विधि कहा जाता है स्थापित करेगा, तो प्रत्येक आगामी कॉल पर पहली गणना का परिणाम वापस करें। यदि आप ऐसा कर रहे थे, तो आपको @circumference से nil पर सेट करना सुनिश्चित करना होगा जब त्रिज्या यह सुनिश्चित करने के लिए बदल जाए कि यह सटीक है।

+0

हालांकि, मुझे दूसरी दूसरी धारणा के साथ स्पष्टीकरण देना चाहिए - मुझे लगा कि मुझे 'ऐप/मॉडल/सर्कल.आरबी' में अपनी गणना करने की आवश्यकता होगी, लेकिन क्या मैं 'परिधि' को सरल के रूप में उपयोग करने में सक्षम हूं परिवर्तनीय (यानी '@ परिधि' आवृत्ति चर) या क्या मुझे इसे 'सर्कल' के लिए अपनी डेटाबेस तालिका के तत्व के रूप में जोड़ने की आवश्यकता होगी? – Nick

+1

यदि आप अपनी तालिका में यह 'attr' जोड़ते हैं तो आपको यह सुनिश्चित करने के लिए अतिरिक्त कोड की आवश्यकता है कि आपके' त्रिज्या 'में परिवर्तन भी आपके' परिधि 'की पुनः गणना करें। इसके लिए विशेषता के 'def' को इस उत्तर की तुलना में थोड़ा अलग तरीके से संभाला जाना आवश्यक है। –

+0

'before_save: recalculate_fields' –

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