यदि किसी मॉडल में एक निश्चित कॉलम / विशेषता है तो कैसे जांचें?


123

मेरे पास एक विधि है जिसे हैश के माध्यम से लूप करने की आवश्यकता है और जांचें कि क्या प्रत्येक कुंजी एक मॉडल तालिका में मौजूद है, अन्यथा यह कुंजी / मान को हटा देगा।

उदाहरण के लिए

number_hash = { :one => "one", :two => "two" }

और नंबर तालिका में केवल एक: एक कॉलम है: दो हटा दिया जाएगा।

मैं कैसे जांचूं कि किसी मॉडल में कोई विशेषता है या नहीं?

जवाबों:


205

एक वर्ग के लिए

उपयोग करें Class.column_names.include? attr_nameजहां attr_nameआपकी विशेषता का स्ट्रिंग नाम है।

इस मामले में: Number.column_names.include? 'one'

एक उदाहरण के लिए

का उपयोग करें record.has_attribute?(:attr_name)या record.has_attribute?('attr_name')(रेल 3.2+) या record.attributes.has_key? attr_name।

इस मामले में: number.has_attribute?(:one)या number.has_attribute?('one')याnumber.attributes.has_key? 'one'


बोनस अंकों के उपयोग के लिए Hash#select:number_hash.select { |key, value| Number.column_names.include? key }
— hgmnz

28
रेल 3.2+ में, number.has_attribute?जो प्रतीक या स्ट्रिंग को स्वीकार करता है ,
— उसका

मेरा मानना ​​है कि यदि कोई ऑब्जेक्ट किसी अन्य ऑब्जेक्ट के लिए एक विधि को दर्शाता है, तो यह विधि गलत तरीके से कॉलम के मौजूद होने का सुझाव देगी। मैं उन लोगों के लिए अपने मॉडल की जाँच कर रहा था जिनके पास एक था user, लेकिन इसके बजाय user_idकुछ मॉडलों को उपयोगकर्ता को सौंपने के लिए देखना था ।
— MattyB

Hash#has_key?के पक्ष में पदावनत किया जाता हैHash#key?
— चार्ल्स हैमल

कैसे उपयोग करने के बारे attribute_method? एक वर्ग के लिए:Number.attribute_method? 'one'
— हमारा मायनस

13

यदि आपको उपनाम के रूप में अच्छी तरह से जांच करने की आवश्यकता है, तो आप उपयोग कर सकते हैं Number.method_defined? attr_nameया number.class.method_defined? attr_name।

मुझे ऐसा मोंगॉयड ऑब्जेक्ट के लिए करना था जिसमें अलियास फ़ील्ड्स थे।


मैंने पाया ModelName.attribute_method? :attr_nameकि मेरे उदाहरण में क्या काम किया गया था
— किसी दिन

10

आपके उदाहरण ऑब्जेक्ट में, आप defined? instance.attributeया भी उपयोग कर सकते हैं instance.respond_to? :attribute।
एक मॉडल विशेषता या किसी भी विधि की जांच करने के लिए ये अधिक सामान्य समाधान हैं।


3
कृपया ध्यान रखें:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
— मारब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.