2012-01-03 14 views
12

रेल में class_attribute आरंभ करने का सही तरीका क्या है?रेल में class_attribute प्रारंभ करने का सही तरीका क्या है?

मैं इस का उपयोग कर रहा:

class Foo < ActiveRecord::Base 

    class_attribute :foobar 
    self.foobar = [] 

    # ... 

end 

ठीक से काम करने लगता है कौन, लेकिन यह भी मेरे लिए एक सा देखने के लिए गैर Railsy लगता है।

उत्तर

8

यहाँ सब कुछ वर्णित है: http://apidock.com/rails/Class/class_attribute

आप पर "शो स्रोत" पर क्लिक करें यदि आप कोई विकल्प डिफ़ॉल्ट मान सेट करने के लिए उपलब्ध हैं देखेंगे। आपका ऐसा करना सही है।

+1

एफवाईआई मैंने आपको कम नहीं किया लेकिन मैं आपके द्वारा चिपकाए गए यूआरएल पर जो कर रहा हूं उसके लिए कोई समर्थन नहीं देख सका। मैं वास्तव में पहले से ही देख रहा था कि डिफ़ॉल्ट मान के लिए कोई विकल्प था या नहीं। रेल में पर्याप्त जादू है कि मैं एक निश्चित जवाब प्राप्त करना चाहता था। चारों ओर खोज करने के बाद मुझे यह आधिकारिक रेल गाइड मिला जो प्रारंभिक तरीके की एक ही विधि का उपयोग कर रहा है क्योंकि मैं http://edgeguides.rubyonrails.org/active_support_core_extensions.html#class-attributes हूं इसलिए मुझे लगता है कि यह सब अच्छा है! – poochenza

+0

ऊपर उठ जाएगा, इसके बारे में खेद है। खुशी है कि आप इसे मिला। Pls सवाल संपादित करें ताकि मैं इसे सही कर सकूं। – lzap

+0

आपको अपने प्रश्न में कम से कम एक चरित्र को बदलना है, मैं अन्यथा ऊपर नहीं जा सकता ... – lzap

1

आपने जो किया है वह अच्छी तरह से काम करता है (जब तक आप विरासत में नहीं होते)।

यदि आप इस कक्षा से विरासत में हैं तो आप 'लीकिंग' से बचने के लिए inherited विधि का उपयोग कर सकते हैं।

def self.inherited(sub_class) 
    self.foobar = self.foobar.clone 
    # or `self.foobar = []` 
end 
+0

अस्वीकरण चेतावनी: ऐसा लगता है कि कुछ (शायद एक मणि/प्लगइन) ActiveRecord :: Base.inherited विधि को ओवरराइड कर रहा है। यह महत्वपूर्ण है कि यह हुक निष्पादित हो ताकि आपके मॉडल सही तरीके से स्थापित हो जाएं। 3.2 में त्रुटि उत्पन्न करने से रोकने के लिए एक वर्कअराउंड जोड़ा गया है, लेकिन हुक ओवरराइड होने पर भविष्य के संस्करण बस काम नहीं करेंगे। यदि आप कामिनारी का उपयोग कर रहे हैं, तो कृपया अपग्रेड करें क्योंकि यह इस समस्या के लिए जाना जाता है। –

0

एक default विकल्प इस साल रेल की शाखा मास्टर पर जोड़ा गया है, की जाँच करें: https://github.com/rails/rails/pull/29270। इस परिवर्तन के साथ, आप कर सकते हैं:

class Foo < ActiveRecord::Base 
    class_attribute :foobar, default: [] 
end 
संबंधित मुद्दे