【问题标题】:How get integer value from a enum in Rails?如何从 Rails 中的枚举中获取整数值?
【发布时间】:2014-10-23 13:54:34
【问题描述】:

我的模型中有一个与数据库中的列相对应的枚举。

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
  • Nops...因为我不知道哪个计划将其存储在数据库中。所以我想恢复它并将其转换为integer

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

我在我的模型中编写了一个方法来在我的 Rails 5.1 应用程序中实现同样的效果。

根据您的情况,将其添加到您的模型中,并在需要时在对象上调用它

def numeric_sale_info
  self.class.sale_infos[sale_info]
end

【讨论】:

    【解决方案2】:

    如果您想获得plan_2 的值,我的简短回答是Model.sale_infos[:plan_2]

    【讨论】:

      【解决方案3】:

      导轨

      另一种方法是使用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
      

      【讨论】:

      • @GrantBirchmeier 更新了答案。你可以使用read_attribute_before_type_cast。
      • 在 Rails 5 之前,model.read_attribute('sale_info') 等于 model[:sale_info]
      【解决方案4】:

      你可以像这样得到整数:

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

      rails 5 更新

      对于 rails 5,上述方法现在返回字符串值 :(

      目前我能看到的最好的方法是:

      my_model.sale_info_before_type_cast
      

      Shadwell 的回答也继续适用于 rails 5。

      【讨论】:

      • 因为 'enum' 会为你的模型创建一个方法 sale_info,使用 [:sale_info] 来获取属性值而不是从 sale_info 方法返回。
      • 请注意,如果模型尚未保存,则此方法不起作用。 sale_info_before_type_cast 值(和 my_model[:sale_info])如果 my_model.sale_info 已被分配一个字符串而没有后续保存,则它仍然是一个字符串。
      【解决方案5】:

      您可以从枚举所在的类中获取枚举的整数值:

      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
      

      【讨论】:

      • 我喜欢这种方法。使用 before_type_cast 时,如果你在一个未保存的记录上,它会返回一个字符串,你已经像 Post.new status: :unapproved 一样初始化,但如果它是持久的,它会返回一个整数。
      猜你喜欢
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多