使用字符串值为整数集创建一个轨道记录nil静默

Ana*_*and 3 ruby-on-rails rails-activerecord

在我的rails(4.2.1)app中,我有一个Post带整数字段的模型foo.创建帖子时,我将一个字符串传递给整数字段.我期待一个错误,但记录是通过foo设置为创建的nil.为什么我没有收到错误?

# migration
class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :name
      t.integer :foo

      t.timestamps null: false
    end
  end
end

# post creation, no error ???
Post.create!(name: 'a post', foo: 'a_string')

# post has nil value in foo
Post.first
#=> Post id: 1, name: "a post", foo: nil, ...
Run Code Online (Sandbox Code Playgroud)

实际上,我想为Post编写一个失败的测试,然后我会将foo改为enum以使测试通过.我很惊讶测试没有引起错误.

mil*_*ner 6

这是db的"特性".此时Rails不知道属性的类型.如果您希望它只接受整数,您可以使用validates_numericality_of :foo.

如果您希望测试失败而不是枚举,您可以执行类似的操作

expect { subject.foo = 'invalid value' }.to raise_exception(ArgumentError)

这样,只要它不是枚举就会失败.