Rails:默认属性值与`validates_inclusion_of`冲突

时间:2014-03-17 14:02:59

标签: ruby-on-rails validation

我有这样的事情:

class AddTestToPeople < ActiveRecord::Migration
  def change
    add_column :people, :status, :string, default: "normal"
  end
end

class Person < ActiveRecord::Base
  validates_inclusion_of :status, in: [ "normal", "super" ]
end

... status的默认"normal"值在创建新记录时未通过验证。我想我可以放弃默认值,但我很好奇为什么这不起作用。有人可以开导我吗?

1 个答案:

答案 0 :(得分:1)

Default值在数据库中设置。

当您尝试在people表中插入记录并将status属性设置为nil时,只有默认值normal将插入数据库中{ {1}}列。

如果在保存新记录时没有将任何值传递给status属性,则其值将为零。因此,验证不会通过。 status只能设置为&#34; normal&#34;在插入记录时。

我建议你修改模型如下,数据库会处理默认值:

Status

或者

如Danny建议的那样,第二个选项是设置after_initialize回调,并在未指定时设置默认值class Person < ActiveRecord::Base validates_inclusion_of :status, in: [ "super" ], allow_nil: true end 。如果您使用此选项,那么我不认为您需要DB级别的默认值,因为状态字段始终从Model设置。

status