รับค่าจำนวนเต็มจาก enum ใน Rails ได้อย่างไร?


106

ฉันมี enum ใน Model ของฉันที่ตรงกับคอลัมน์ในฐานข้อมูล

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
Florian Gl

อ๊ะ ... เพราะฉันไม่รู้ว่ามันมีแผนเก็บไว้ที่ฐานข้อมูลไหน ดังนั้นฉันต้องการกู้คืนและโยนมันเป็นinteger
Cleyton

คำตอบ:


141

คุณสามารถรับค่าจำนวนเต็มสำหรับ enum จากคลาสที่ enum เปิดอยู่:

Model.sale_infos # Pluralized version of the enum attribute name

ที่ส่งคืนแฮชเช่น:

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

จากนั้นคุณสามารถใช้ค่า sale_info จากอินสแตนซ์ของModelคลาสเพื่อเข้าถึงค่าจำนวนเต็มสำหรับอินสแตนซ์นั้น :

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

141

คุณจะได้รับจำนวนเต็มดังนี้:

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

อัพเดตสำหรับราง 5

สำหรับราง 5 วิธีการข้างต้นจะคืนค่าสตริง :(

วิธีที่ดีที่สุดที่ฉันเห็นในตอนนี้คือ:

my_model.sale_info_before_type_cast

คำตอบของ Shadwell ยังคงใช้งานได้กับราง 5


1
เป็นเพราะ 'enum' จะสร้างเมธอด sale_info สำหรับโมเดลของคุณให้ใช้ [: sale_info] เพื่อรับค่าคุณสมบัติแทนการส่งคืนจากเมธอด sale_info
etlds

6
โปรดทราบว่าวิธีนี้ใช้ไม่ได้หากยังไม่ได้บันทึกโมเดล ค่า sale_info_before_type_cast (และ my_model [: sale_info]) ยังคงเป็นสตริงถ้า my_model.sale_info ได้รับการกำหนดสตริงโดยไม่มีการบันทึกในภายหลัง
Tim Smith

43

ราง <5

อีกวิธีหนึ่งคือการใช้read_attribute():

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

ราง> = 5

คุณสามารถใช้ได้ read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@GrantBirchmeier อัปเดตคำตอบ คุณสามารถใช้read_attribute_before_type_cast.
ArashM

ก่อน Rails 5 model.read_attribute ('sale_info') เท่ากับ model [: sale_info]
zw963


1

ฉันเขียนวิธีการใน Model ของฉันเพื่อให้ได้สิ่งเดียวกันในแอป Rails 5.1 ของฉัน

จัดเตรียมสำหรับกรณีของคุณเพิ่มสิ่งนี้ลงในโมเดลของคุณและเรียกใช้บนวัตถุเมื่อจำเป็น

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.