मैं ActiveRecord मॉडल में एक गेट्टर विधि को कैसे लिख सकता हूं?


98

मैं ActiveRecord मॉडल के लिए एक गेट्टर विधि को अधिलेखित करने का प्रयास कर रहा हूं। मेरे पास nameमॉडल में एक विशेषता है Category, और मैं ऐसा कुछ करने में सक्षम होना चाहता हूं:

def name
  name_trans || name
end

यदि name_transविशेषता शून्य नहीं है, तो इसे वापस लौटाएं, अन्यथा वापसी nameविशेषता। यह मैं कैसे करूंगा?

इसे तब सामान्य रूप से इस तरह बुलाया जाना चाहिए:

@category.name

जवाबों:


123

रेल स्टाइल गाइड उपयोग करने की सलाह self[:attr]से अधिक read_attribute(:attr)

आप इसे इस तरह से उपयोग कर सकते हैं:

def name
  name_trans || self[:name]
end

यह बेहतर क्यों है? केवल अन्य साइटों से लिंक न करें, यहां प्रासंगिक बिट्स शामिल करें। लिंक अमान्य हो सकते हैं
जेम्सटी

2
थोड़ा और संदर्भ के लिए यहाँ देखें: github.com/bbatsov/rails-style-guide/issues/155
mimsugara

98

अपडेट: रेल स्टाइल गाइड के अनुसार पसंदीदा तरीका और के self[:name]बजाय उपयोग करना है । मैं आपको अपना उत्तर छोड़ने के लिए प्रोत्साहित करूंगा और इसके बजाय यह पसंद करूंगा ।read_attributewrite_attribute


आप इसे बिल्कुल वैसा ही कर सकते हैं, सिवाय इसके कि आपको read_attributeनाम विशेषता का मूल्य प्राप्त करने के लिए उपयोग करने की आवश्यकता है और nameविधि के लिए पुनरावर्ती कॉल से बचें :

def name 
  name_trans || read_attribute(:name)
end

2
किसी भी विचार क्यों Rubocop पसंद करते self[:name]हैं read_attribute[:name]?
ज़ैक जू

18

मैं एक और विकल्प जोड़ना चाहूँगा जो ओवरराइट करने की विधि है, जो कि केवल another सुपर है।

def name
  name_trans || super
end

यह न केवल गुणक विधि पर काम करता है, बल्कि संघों को भी विधायक विधि。 बहुत attributes


1
यह वही है जो रेल मार्गदर्शक वर्तमान में अनुशंसा करते हैं, गेटर्स
sandre89

5

गेटटर को ओवरराइड करना और उपयोग read_attributeकरना संघों के लिए काम नहीं करता है, लेकिन आप alias_method_chainइसके बजाय उपयोग कर सकते हैं ।

def name_with_override
  name_trans || name_without_override
end

alias_method_chain :name, :override

क्या आप एक उचित उदाहरण दे सकते हैं ...?
अरूप रक्षित

कुंआ। मैंने सिर्फ डोको को देखा । अब अगर मैं nameमॉडल ऑब्जेक्ट पर कॉल करता हूं , तो किसको बुलाया जाएगा - name_with_overrideया name_without_override?
अरूप रक्षित

1
nameअब फोन करेंगे name_with_override। यदि आप किसी कारण से मूल विधि को कॉल करना चाहते हैं, तो आप कॉल कर सकते हैं name_without_override
पैट्रिक ऑस्सिटी

OI देखें .. आपके उत्तर के लिए धन्यवाद //
अरूप रक्षित

2

यदि आप इस तरह स्टोर विशेषताओं का उपयोग कर रहे हैं

store :settings, accessors: [:volume_adjustment] 

या रत्न लिंक जैसे रत्नों का उपयोग करना hstore_accessor

इसलिए आपने storeमॉडल पर विधि का उपयोग करना समाप्त कर दिया , फिर उन विधि को ओवरराइड करने के लिए जिन्हें आप उपयोग नहीं कर सकते हैं self.read_attribute, आपको इसके बजाय उपयोग करना होगा super:

def partner_percentage
  super.to_i || 10
end

0

यदि कोई name_transगटर विधि में मूल्य को अद्यतन करना चाहता है , तो आप स्वयं [: नाम] = का उपयोग कर सकते हैं।

def name
  self[:name] = name_trans || self[:name]
  # don't do this, it will cause endless loop
  # update(name: name_trans)
end

0

आप पठन पाठ विधि का उपयोग कर सकते हैं। रेल्स डॉक्स


हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, केवल SO पर लिंक के उत्तरों की अनुमति नहीं है, कृपया उस लिंक के पीछे से अपने उत्तर में कुछ संदर्भ जोड़ें। धन्यवाद! :)
AJT82
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.