Rails'de bir numaralandırmadan tamsayı değeri nasıl alınır?


105

Modelimde, veritabanındaki sütuna karşılık gelen bir enum var.

enumBakışlar ister:

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

Tamsayı değerini nasıl alabilirim?

denedim

Model.sale_info.to_i

Ancak bu yalnızca 0 döndürür.


Olması gerekmiyor Model.sale_info.value.to_imu? egModel.sale_info.plan_1.to_i
Florian Gl

Hayır ... Çünkü veritabanında hangi mağazayı planladığını bilmiyorum. Bu yüzden onu kurtarmak ve rolünü integer
oynatmak

Yanıtlar:


140

Numaralandırmanın bulunduğu sınıftan bir enum için tam sayı değerlerini alabilirsiniz:

Model.sale_infos # Pluralized version of the enum attribute name

Bu, aşağıdaki gibi bir hash döndürür:

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

Daha sonra, söz konusu örnek içinModel tamsayı değerine erişmek için sınıfın bir örneğindeki sale_info değerini kullanabilirsiniz :

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

139

Tam sayıyı şu şekilde alabilirsiniz:

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

Raylar için güncelleme 5

Raylar 5 için yukarıdaki yöntem artık dize değerini döndürür :(

Şimdilik görebildiğim en iyi yöntem:

my_model.sale_info_before_type_cast

Shadwell'in cevabı raylar için de çalışmaya devam ediyor 5.


1
Bunun nedeni 'enum', modeliniz için sale_info yöntemini oluşturacağından, sale_info yönteminden dönüş yöntemi yerine özellik değerini almak için [: sale_info] 'yu kullanın.
etlds

6
Model kaydedilmediyse bu yöntemin işe yaramayacağını unutmayın. Sale_info_before_type_cast değeri (ve my_model [: sale_info]), my_model.sale_info'ya daha sonra kaydetme yapılmadan bir dizge atanmışsa, yine de bir dizedir.
Tim Smith

42

Raylar <5

Başka bir yol kullanmaktır read_attribute():

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

Raylar> = 5

Kullanabilirsiniz read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@GrantBirchmeier Cevabı güncelledi. Kullanabilirsiniz read_attribute_before_type_cast.
ArashM

Rails 5'ten önce, model.read_attribute ('sale_info') modele eşit [: sale_info]
zw963

1

Kısa cevabım, Model.sale_infos[:plan_2]eğer değer elde etmek istiyorsanızplan_2


1

Rails 5.1 uygulamamda aynı şeyi elde etmek için Modelimde bir yöntem yazdım.

Davanız için yiyecek ve içecek, bunu Modelinize ekleyin ve gerektiğinde nesne üzerinde çağırın

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.