रेल में एनम से पूर्णांक मान कैसे प्राप्त करें?


105

मेरे पास अपने मॉडल में एक एनम है जो डेटाबेस में कॉलम से मेल खाती है।

enumऐसा लगता है कि:

  enum sale_info: { plan_1: 1, plan_2: 2, plan_3: 3, plan_4: 4, plan_5: 5 }

मुझे पूर्णांक मान कैसे मिल सकता है?

मैंने कोशिश की

Model.sale_info.to_i

लेकिन यह केवल 0 देता है।


यह नहीं होना चाहिए Model.sale_info.value.to_i? जैसेModel.sale_info.plan_1.to_i
फ्लोरियन Gl

नहीं ... क्योंकि मुझे नहीं पता कि डेटाबेस में इसकी दुकान की योजना क्या है। इसलिए मैं यह ठीक करने के लिए करना चाहते हैं और के रूप में एक यह डालीinteger
Cleyton

जवाबों:


140

जिस वर्ग में एनम चालू है, उससे आप एक एनम के लिए पूर्णांक मान प्राप्त कर सकते हैं:

Model.sale_infos # Pluralized version of the enum attribute name

यह एक हैश देता है:

{ "plan_1" => 1, "plan_2" => 2 ... }

तब आप उस उदाहरण के लिएModel पूर्णांक मान तक पहुँचने के लिए वर्ग के एक उदाहरण से sale_info मान का उपयोग कर सकते हैं :

my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value

139

आप पूर्णांक प्राप्त कर सकते हैं जैसे:

my_model = Model.find(123)
my_model[:sale_info] # Returns the integer value

रेल के लिए अद्यतन 5

रेल 5 के लिए उपरोक्त विधि अब स्ट्रिंग मान लौटाती है :(

अब मैं देख सकता हूं कि सबसे अच्छी विधि है:

my_model.sale_info_before_type_cast

शादवेल का जवाब भी रेल 5 के लिए काम करना जारी रखता है।


1
ऐसा इसलिए है क्योंकि 'enum' आपके मॉडल के लिए एक मेथड sale_info बनाएगा, जिसके लिए sale_info मेथड से वापसी के बदले प्रॉपर्टी वैल्यू प्राप्त करने के लिए [: sale_info] का उपयोग करें।
एटर्स

6
ध्यान दें कि यदि मॉडल सहेजा नहीं गया है तो यह विधि काम नहीं करती है। अगर यह my_model.sale_info को बाद में सहेजे बिना एक स्ट्रिंग सौंपा गया है, तो sale_info_before_type_cast मूल्य (और my_model [: sale_info]) अभी भी एक स्ट्रिंग है।
टिम स्मिथ

42

रेलें <५

उपयोग करने का एक और तरीका होगा read_attribute():

model = Model.find(123)
model.read_attribute('sale_info')

रेलें = = ५

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

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@GrantBirchmeier जवाब का अद्यतन किया। आप उपयोग कर सकते हैं read_attribute_before_type_cast
अरशम

रेल 5 से पहले, model.read_attribute ('sale_info') मॉडल के बराबर [: sale_info]
zw963

1

Model.sale_infos[:plan_2]यदि आप मूल्य प्राप्त करना चाहते हैं तो मेरा संक्षिप्त उत्तर हैplan_2


1

मैंने अपने मॉडल में अपनी रेल 5.1 ऐप में समान हासिल करने के लिए एक विधि लिखी।

अपने मामले के लिए खानपान, इसे अपने मॉडल में जोड़ें और जरूरत पड़ने पर ऑब्जेक्ट पर कॉल करें

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.