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


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.