2011-05-30 16 views
6

मुझे एहसास है कि यह करने का सबसे बुद्धिमान तरीका नहीं है, लेकिन अब मेरी जिज्ञासा सक्रिय है और मैं उत्सुक हूं कि इसे करने के लिए कैसे करें।रेल मॉडल पर गतिशील तरीके

मेरे पास रेल परियोजना में एक मॉडल है। हम इसे डील कहते हैं। प्रति ActiveRecord और उन सभी अच्छी चीजें डेटाबेस में UPDATED_AT जैसे डेटाबेस में परिभाषित कॉलम हैं और वे डील पर विधियां बनती हैं: deal.updated_at => '04/19/1 9 66 3:15 पूर्वाह्न '

कहें कि मैं इसके बजाय विधियों को बनाना चाहता हूं मुझे पूरे दिनांक और समय की चीज़ के बजाय सप्ताह के दिन बताया। मुझे पता है वहाँ दिनांक समय वर्ग पर तरीके हैं तो मैं

deal.updated_at.day_of_week => 'Monday' (*) 

है, लेकिन क्या कर सकते हैं अगर मैं सिर्फ

deal.updated_day => 'Monday' 

मैं deal.rb

def update_day 
    self.updated_at.day_of_week 
    end 

में लिख सकते हैं चाहता था समझ गया।

लेकिन क्या होगा अगर मैं है हमेशा को यह चाहते थे विधि किसी भी तारीख स्तंभ है कि मॉडल को जोड़ा गया है के लिए उपलब्ध?

मैंने वहां define_method देखा (कुछ यहाँ StackOverflow पर)। तो मैं समझता हूँ। लेकिन मैं ActiveRecord के जादू के ठीक बाद इसे कॉल करना चाहता हूं, है ना? तो अगर मेरे डील मॉडल ने update_at, बनाया_at, offer_at और lawuit_at किया था, तो मैं प्रत्येक के लिए मिलान विधियों को चाहता हूं। सबसे महत्वपूर्ण बात यह है कि यदि कोई अन्य डेवलपर आया और scammed_at नामक कॉलम जोड़ा, तो मैं scammed_at विधि के साथ scammed_day बनाया चाहता था।

मैं यह कैसे करूँगा?

धन्यवाद।

(*) उह, या ऐसा कुछ, मैं हमेशा कॉल करता हूं।

उत्तर

8

मुझे लगता है कि निम्नलिखित की तरह कुछ चाल करना चाहिए। अपने मॉडल में:

# looping through all model's columns 
self.columns.each do |column| 
    #if column's name ends with "_at" 
    if column.name =~ /_at$/ 
    #create method like "udpated_day" 
    define_method "#{column.name[0..-4]}_day" do 
     self.send(column.name).day_of_week 
    end 
    end 
end 

लेकिन यह निकलता है कि प्रत्येक स्तंभ में एक वैध day_of_week विधि है ...

वैसे आप विचार मुझे लगता है कि मिलता है। विवरण के लिए पूछने में संकोच न करें

+1

आप 'define_method' कॉल को कॉलम.नाम = ~/_at $ /' सशर्त में लपेटेंगे। –

+0

आप निश्चित रूप से सही हैं, सुधार जोड़ा गया है, धन्यवाद – apneadiving

+0

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

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