2012-06-28 15 views
5

मैं अपने रेल मॉडल के अंदर एक इंस्टेंस वैरिएबल प्रारंभ करना चाहता हूं जो एक सरणी रखेगा और मैं इस मॉडल को अपने मॉडल के भीतर अन्य तरीकों से एक्सेस करना चाहता हूं। मैं इस की कोशिश की:रेल मॉडल में इंस्टेंस वैरिएबल

class Participant < ActiveRecord::Base 

    @possible_statuses = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

    def statuses 
    @possible_statuses 
    end 

लेकिन जब मैं निम्नलिखित का उपयोग कर रेल सांत्वना की कोशिश की:

Participant.first.statuses 

मैं शून्य :(

लौटे हूँ इस क्यों होता है वहाँ पूरा करने के लिए एक तरीका है? मैं क्या हासिल करने की कोशिश कर रहा हूं?

उत्तर

3

मेरे लिए सबसे अच्छा जवाब एक वर्ग चर बनाने के लिए किया गया था, नहीं एक उदाहरण चर:

@@possible_statuses = [ 
    'exists', 
    'paired', 
    'chat1_ready', 
    'chat1_complete' 
] 

मैं तो स्वतंत्र रूप से यह वर्ग के तरीकों में पहुंच सकता है:

def status=(new_status) 
    self.status_data = @@possible_statuses.index(new_status) 
    end 
+1

यदि इस वर्ग चर का मान निरंतर होने वाला है तो यह ठीक है अन्यथा यह http://stackoverflow.com/questions/9396563/why-should- हम-से बचने का इस्तेमाल करने वाली श्रेणी-चर-इन-रेल – Bot

10

मैं इस तरह के मामलों के लिए निरंतर उपयोग करने की अनुशंसा करता हूं:

class Participant < ActiveRecord::Base 

    STATUSES = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

तुम सिर्फ STATUSES करते हैं, और बाहर कक्षा उपयोग Participant::STATUSES

2

अपने उदाहरण में से, @possible_statuses, अंदर वर्ग से है कि सरणी का उपयोग करना चाहते हैं तो वर्ग के बजाय की प्रत्येक आवृत्ति पर एक चर रहा है उदेश्य।

class Participant < ActiveRecord::Base 

    @possible_statuses = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

    def self.possible_statuses 
    @possible_statuses 
    end 

    def possible_statuses 
    self.class.possible_statuses 
    end 

    def statuses 
    possible_statuses 
    end 

end 

, अन्य उत्तर में उल्लेख किया है, तो स्थितियां की उस सूची कभी नहीं बदलता, आप बल्कि एक चर से एक निरंतर का उपयोग करना चाहिए के रूप में: आप इसे इस तरह पूरा हो सकता है की एक नहीं बल्कि वर्बोज़ उदाहरण है।

+0

मैं 2 मॉडल : नौकरी और संगठन। एक संगठन में कई नौकरियां हैं, और एक नौकरी एक संगठन से संबंधित है। संगठन नौकरियां पोस्ट करते हैं, मेरे ऐप में कहीं भी देखने के लिए अनुमोदित होने की आवश्यकता है। दोनों खोजा जा सकता है (कभी पाया जा सकता है, उन्हें अनुमोदित करने की आवश्यकता है)। मैं जो करना चाहता हूं उसके पास मेरे नौकरी मॉडल में एक चर है जो "नौकरियां जिनके संगठन को मंजूरी दे दी गई है"। इसलिए जब मैं नौकरियों के लिए खोज विधि लिखता हूं, तो मेरे पास कुछ @ @ approved_jobs.where ('शीर्षक पसंद है? और विवरण पसंद है?', पैरा [: खोज], पैराम्स [: खोज]) हो सकता है। आप कहां और कैसे करेंगे @approved_jobs वैरिएबल मुझे परिभाषित करने के लिए? thx – Myna

+0

मैं इस समस्या को हल करने के लिए डेटाबेस का उपयोग करूंगा। जॉब्स टेबल में एक अनुमोदित बूलियन फ़ील्ड जोड़ें। फिर एक दायरा जोड़ें - "स्कोप: अनुमोदित, जहां (: approved => true)"। फिर आप @approved_jobs के बजाय Job.approved का उपयोग करते हैं। –

+0

संगठन तालिका में एक अनुमोदित बूलियन है, और मेरे पास नौकरियों के लिए एक अनुमोदित बूलियन नहीं है। अगर मैंने नौकरियों के लिए भी एक बूलियन स्थापित किया है, तो मैं कैसे कहूं "अगर कोई संगठन अनुमोदित है, इसकी सभी नौकरियों को भी अनुमोदित किया जाना चाहिए। और इसके विपरीत "एसोसिएशन और मॉडलों का उपयोग करते हुए? – Myna

0

इंस्टेंस वैरिएबल केवल तभी अस्तित्व में होगा जब आप मॉडल बनाते हैं, क्योंकि इसे कहीं भी डेटाबेस में संग्रहीत नहीं किया जा रहा है। नोबिता के सुझाव के अनुसार आप इसे स्थिर बनाना चाहते हैं। वैकल्पिक रूप से, आप इसे एक मॉड्यूल की तरह IMO कर सकता है ...

module Status 
    EXISTS = "exists" 
    PAIRED = "paired" 
    QUIZ_FINISHED = "quiz_finished" 
    QUIZ_RESULTS_SEEN = "quiz_results_seen" 
    MONEY_SENT = "money_sent" 

    def self.all 
    [EXISTS, PAIRED, QUIZ_FINISHED, QUIZ_RESULTS_SEEN, MONEY_SENT] 
    end 
end 

यह आपको थोड़ा अधिक नियंत्रण और लचीलापन देता है। आप अपने मॉडल में घोंसला इस कोड को शामिल करेंगे।

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