ruby-on-rails 如何在Rails中从枚举中获取整数值?

tzxcd3kk  于 4个月前  发布在  Ruby
关注(0)|答案(6)|浏览(66)

我在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。

4ioopgfo

4ioopgfo1#

Rails < 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

oxiaedzo

oxiaedzo2#

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

piok6c0g

piok6c0g3#

我在我的Model中写了一个方法来在我的Rails 5.1应用程序中实现同样的功能。
根据您的情况,将其添加到Model中,并在需要时在对象上调用它

def numeric_sale_info
  self.class.sale_infos[sale_info]
end

字符串

owfi6suc

owfi6suc4#

这里的大多数解决方案都需要你手头有一个记录或模型类。这里有一种方法,你可以通过使用Hash的.key方法从枚举中获取整数值,而不需要创建记录:

sale_info.key('plan_3')
=> 3

字符串
如果您正在执行一些ETL并在依赖于不同场景中的数字整数值和/或字符串值的系统之间将原始值Map到字符串值/从字符串值Map原始值,则这一点特别有用。
请注意,这可能不是很高的性能,因为在散列中搜索值(而不是键)效率不高。如果你每秒处理数百万个值,或者有一个包含数百个值的枚举,你可能需要构建一个新的散列,将枚举的值和键反转,这样你就可以在相反的方向上进行高效的查找。

gr8qqesn

gr8qqesn5#

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

Model.sale_infos # Pluralized version of the enum attribute name

字符串
它返回一个哈希值,如下所示:

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


然后,您可以使用Model类示例中的销售_info值来访问该示例 * 的整数值 *:

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

b5lpy0ml

b5lpy0ml6#

你可以像这样得到整数:

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

字符串

更新为Rails 5

对于rails 5,上面的方法现在返回字符串值:(
目前我能想到的最好的方法是:

my_model.sale_info_before_type_cast


沙德维尔的答案也适用于rails 5。

相关问题