Bagaimana mendapatkan nilai integer dari enum di Rails?

105

Saya memiliki enum di Model saya yang sesuai dengan kolom di database.

The enumterlihat seperti:

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

Bagaimana saya bisa mendapatkan nilai integer?

Saya sudah mencoba

Model.sale_info.to_i

Tapi ini hanya mengembalikan 0.

Cleyton
sumber
Bukankah seharusnya begitu Model.sale_info.value.to_i? misalnyaModel.sale_info.plan_1.to_i
Florian Gl
Nops ... Karena saya tidak tahu paket mana yang disimpan di database. Jadi saya ingin memulihkannya dan menampilkannya sebagaiinteger
Cleyton

Jawaban:

140

Anda bisa mendapatkan nilai integer untuk enum dari kelas tempat enum berada:

Model.sale_infos # Pluralized version of the enum attribute name

Itu mengembalikan hash seperti:

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

Anda kemudian dapat menggunakan nilai sale_info dari sebuah instance Modelkelas untuk mengakses nilai integer untuk instance itu :

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

Anda bisa mendapatkan integer seperti ini:

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

Pembaruan untuk rel 5

Untuk rails 5, metode di atas sekarang mengembalikan nilai string :(

Metode terbaik yang bisa saya lihat untuk saat ini adalah:

my_model.sale_info_before_type_cast

Jawaban Shadwell juga terus bekerja untuk rel 5.

Subtree
sumber
1
Itu karena 'enum' akan membuat metode sale_info untuk model Anda, gunakan [: sale_info] untuk mendapatkan nilai properti alih-alih mengembalikan dari metode sale_info.
etlds
6
Perhatikan bahwa metode ini tidak berfungsi jika model belum disimpan. Nilai sale_info_before_type_cast (dan my_model [: sale_info]) masih berupa string jika my_model.sale_info telah ditetapkan sebagai string tanpa penyimpanan berikutnya.
Tim Smith
42

Rel <5

Cara lain adalah dengan menggunakan read_attribute():

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

Rel> = 5

Kamu bisa memakai read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1
ArashM
sumber
1
@GrantBirchmeier Memperbarui jawabannya. Anda bisa menggunakan read_attribute_before_type_cast.
ArashM
Sebelum Rails 5, model.read_attribute ('sale_info') sama dengan model [: sale_info]
zw963
1

Jawaban singkat saya adalah Model.sale_infos[:plan_2]jika Anda ingin mendapatkan nilaiplan_2

Brilliant-DucN
sumber
1

Saya menulis metode di Model saya untuk mencapai hal yang sama di aplikasi Rails 5.1 saya.

Katering untuk kasus Anda, tambahkan ini ke dalam Model Anda dan panggil pada objek saat diperlukan

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
Shrmn
sumber