我正在尝试使用新的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
的问题。
答案 0 :(得分:2)
您可以从数据库声明中设置默认值,例如:
create_table :conversations do |t|
t.column :status, :integer, default: 0
end
好的做法是让第一个声明的状态成为默认状态。
最好遵循该建议,并避免为枚举设置值作为创建的一部分。拥有列的默认值也可以在测试中使用。