ruby-on-rails - Ruby on Rails 4.2 枚举属性

标签 ruby-on-rails enums

我正在尝试使用新的枚举类型,除了一个问题之外,一切正常。在编写功能测试时我通常使用结构:

order = Order.new(o_status: :one)
post :create, order: order.attributes

# Error message:
# ArgumentError: '0' is not a valid o_status

只要我没有 Enum 属性就可以了。枚举的问题在于 .attributes 返回的是整数值,而不是字符串值,该整数值无法作为枚举属性值发布。

在上面的示例中,模型可以如下所示:

class Order < ActiveRecord::Base
  enum o_status: [:one, :two]
end

当我这样做时我发现:

order = Order.new(o_status: :one)
atts = order.attributes
atts[:o_status] = "one" # it must be string "one" not symbol or integer 0
post :create, order: order.attributes

它会正常工作。

这是正常现象还是有更好的解决方案?

编辑:

我发现的唯一解决方法如下所示:

order = { o_status: :one.to_s }
post :create, order: order
  • 优点:简短、整洁
  • 缺点:在通过邮件发送之前,我无法使用 order.valid? 验证订单

当内部有 Enum 时,这并不能解决 order.attributes 的问题。

最佳答案

来自Enum documentation :

You can set the default value from the database declaration, like:

create_table :conversations do |t|
  t.column :status, :integer, default: 0
end

Good practice is to let the first declared status be the default.

最好遵循该建议,并避免在创建过程中为枚举设置值。为列设置默认值也可以在测试中发挥作用。

关于ruby-on-rails - Ruby on Rails 4.2 枚举属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29445359/

相关文章:

javascript - 更改警报框上的 'ok' 按钮以停止进一步移动

ruby-on-rails - RSpec 中 it block 和 specify block 的区别

java - 如何在 Java 中从没有所有值的枚举创建对象

java - 当类扩展另一个类时如何使用枚举强制单例模式

ruby-on-rails - 在 Rails 的 API 包装器中使用 Thread.current 的替代方法

ruby-on-rails - ruby 调试 "no such file to load --spec_helper"

ruby-on-rails - 为什么我在 bundle exec 中执行环境后 rake 中止

java - 获取枚举实例

c++ - 将 C++ 命名空间枚举包装到 C 接口(interface)

java 设置条件以某个枚举值开始