Railsの列挙型から整数値を取得するにはどうすればよいですか?


105

データベースの列に対応する列挙型がモデルにあります。

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 2014

いいえ...データベースにどのプランを格納するのかわかりません。だから私はそれを回復して、それをとしてキャストしたいと思いますinteger
Cleyton

回答:


140

列挙型が存在するクラスから、列挙型の整数値を取得できます。

Model.sale_infos # Pluralized version of the enum attribute name

それは次のようなハッシュを返します:

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

次に、Modelクラスのインスタンスのsale_info値を使用して、そのインスタンスの整数値にアクセスできます

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

139

あなたはそのような整数を得ることができます:

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

レール5の更新

rails 5の場合、上記のメソッドは文字列値:(

私が今見ることができる最良の方法は:

my_model.sale_info_before_type_cast

Shadwellの答えは、レール5でも引き続き機能します。


1
これは、 'enum'がモデルのメソッドsale_infoを作成するためです。sale_infoメソッドから戻るのではなく、[:sale_info]を使用してプロパティ値を取得します。
etlds

6
モデルが保存されていない場合、このメソッドは機能しないことに注意してください。sales_info_before_type_cast値(およびmy_model [:sale_info])は、my_model.sale_infoに後続の保存なしで文字列が割り当てられている場合、文字列のままです。
Tim Smith

42

レール<5

別の方法は使用することread_attribute()です:

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

Rails> = 5

使用できます read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@GrantBirchmeier回答を更新しました。使用できますread_attribute_before_type_cast
ArashM 2017

Rails 5より前では、model.read_attribute( 'sale_info')はmodel [:sale_info]に等しい
zw963

1

私の短い答えはModel.sale_infos[:plan_2]、あなたが価値を得たい場合のためですplan_2


1

Rails 5.1アプリで同じことを実現するメソッドをモデルに記述しました。

あなたのケースのケータリング、これをモデルに追加し、必要に応じてオブジェクトで呼び出します

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.