88

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

Hình enumnhư:

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

Làm thế nào tôi có thể nhận được giá trị số nguyên?

Tôi đã thử

Model.sale_info.to_i

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

|
118

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

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 thể hiện của Modellớp để truy cập giá trị số nguyên cho thể hiện đó :

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

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

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

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

Đối với đường ray 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 hoạt động cho đường ray 5.

|
  • 1

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

    – Tạ Ngọc Hạ 00:33:49 05/04/2016
  • 1

    Điều này dường như không còn hoạt động nữa trong Rails 5.

    – Dương Công Sinh 12:09:43 06/04/2016
  • 1

    Bạn đúng. Tôi đã thêm một tùy chọn cho đường ray 5

    – Tạ Như Thảo 02:15:19 07/04/2016
  • 1

    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_b Before_type_cast (và my_model [: sale_info]) vẫn là một chuỗi nếu my_model.sale_info đã được gán một chuỗi mà không lưu sau đó.

    – Lý Ngọc Hiếu 05:49:26 09/10/2016
28

Đường ray <5

Một cách khác 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

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 nó 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
|
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ị củaplan_2

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.