Ruby on Rails 4.2枚举属性

时间:2015-04-04 10:32:06

标签: ruby-on-rails enums

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

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

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

只要我没有Enum属性就可以了。枚举的问题是,而不是字符串值.attributes返回它的Integer值,该值不能作为枚举属性值发布。

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

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的问题。

1 个答案:

答案 0 :(得分:2)

来自Enum documentation

  

您可以从数据库声明中设置默认值,例如:

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

好的做法是让第一个声明的状态成为默认状态。

最好遵循该建议,并避免为枚举设置值作为创建的一部分。拥有列的默认值也可以在测试中使用。