Làm cách nào để lấy giá trị số nguyên từ một enum trong Rails?


105

Tôi có một enum trong Mô hình của mình tương ứng với cột trong cơ sở dữ liệu.

Các enumvẻ thích:

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

Làm cách nào để lấy giá trị số nguyên?

Tôi đã thử

Model.sale_info.to_i

Nhưng điều này chỉ trả về 0.


Có nên Model.sale_info.value.to_ikhông? ví dụModel.sale_info.plan_1.to_i
Florian Gl

Rất tiếc ... Vì tôi không biết kế hoạch lưu trữ của nó tại cơ sở dữ liệu nào. Vì vậy, tôi muốn khôi phục nó và quăng nó như mộtinteger
Cleyton

Câu trả lời:


140

Bạn có thể lấy các giá trị số nguyên cho một enum từ lớp mà enum đang ở trên:

Model.sale_infos # Pluralized version of the enum attribute name

Điều đó trả về một hàm băm như:

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

Sau đó, bạn có thể sử dụng giá trị sale_info từ một phiên bản của Modellớp để truy cập giá trị số nguyên cho phiên bản đó :

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

139

Bạn có thể lấy số nguyên như sau:

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

Cập nhật cho đường ray 5

Đối với rails 5, phương thức trên bây giờ trả về giá trị chuỗi :(

Phương pháp tốt nhất tôi có thể thấy bây giờ là:

my_model.sale_info_before_type_cast

Câu trả lời của Shadwell cũng tiếp tục có hiệu quả đối với đường ray 5.


1
Đó là vì 'enum' sẽ tạo phương thức sale_info cho mô hình của bạn, hãy sử dụng [: sale_info] để nhận giá trị thuộc tính thay vì trả về từ phương thức sale_info.
etlds

6
Lưu ý rằng phương pháp này không hoạt động nếu mô hình chưa được lưu. Giá trị sale_info_before_type_cast (và my_model [: sale_info]) vẫn là một chuỗi nếu giá trị my_model.sale_info đã được chỉ định là một chuỗi mà không có lần lưu tiếp theo.
Tim Smith

42

Đường ray <5

Một cách khác sẽ là sử dụng read_attribute() :

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

Đường ray> = 5

Bạn có thể dùng read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@GrantBirchmeier Đã cập nhật câu trả lời. Bạn có thể sử dụng read_attribute_before_type_cast.
ArashM

Trước khi Rails 5, model.read_attribute ( 'sale_info') tương đương với mô hình [: sale_info]
zw963

1

Câu trả lời ngắn gọn của tôi là Model.sale_infos[:plan_2]trong trường hợp nếu bạn muốn nhận được giá trịplan_2


1

Tôi đã viết một phương thức trong Mô hình của mình để đạt được điều tương tự trong ứng dụng Rails 5.1.

Phục vụ cho trường hợp của bạn, thêm cái này vào Mô hình của bạn và gọi nó trên đối tượng khi cần

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.