我正在使用Ruby 1.9.3-p448和Rails 3.2.13。我有这个带浮点格式验证的简单模型:
class User
include Mongoid::Document
include Mongoid::Timestamps
field :height, type: Float
field :weight, type: Float
validates :height, presence: true, format: { with: /[-+]?[0-9]*\.?[0-9]+/ }
validates :weight, presence: true, format: { with: /[-+]?[0-9]*\.?[0-9]+/ }
end
如果我运行此代码:
test = User.new(height:"hi", weight:"try")
它给了我以下结果:
#<User _id: 51f67b49781018056b000008, created_at: nil, updated_at: nil, height: 0.0,width: 0.0>
如果我放一个字符串,为什么mongoid会给一个0.0值?我期待验证错误。
答案 0 :(得分:3)
您没有得到验证错误,因为方法new
没有触发验证,看到它应该执行:
User.create!(height:"hi", weight:"try")
# .../mongoid-3.1.0/lib/mongoid/persistence.rb:335:in `fail_validate!': (Mongoid::Errors::Validations)
# Problem:
# Validation of User failed.
# Summary:
# The following errors were found: Height is invalid, Weight is invalid
# ...
鉴于此,字段height
和weight
填充了0.0
,因为使用String
将Float
转换为to_f
方法,行为如下:
'foo'.to_f
# => 0.0
此外,使用正则表达式验证浮点字段是没用的,因为在验证之前执行到Float
的转换,因此验证总是因=~
的行为而失败:< / p>
1.2 =~ /any_regexp/
# => nil
更新要验证以字符串形式给出的字段是有效数字,您可以使用numericality
选项:
class User
# ...
validates :height, presence: true, numericality: true
# ...
end
User.create!(height: '0.0')
# => #<User ... >
User.create!(height: 'foo')
# Problem:
# Validation of User failed.
# ...
答案 1 :(得分:-1)
MongoDB以称为BSON的二进制格式存储数据,该格式支持以下数字数据类型:
int32
- 4个字节(32位有符号整数)int64
- 8个字节(64位有符号整数)double
- 8个字节(64位IEEE 754浮点)MongoDB中没有与mySQL的十进制类型相当的精确值定点,但您可以将Mongo中的64位浮点数存储为double。
值得一提的是,作为JavaScript shell的MongoDB shell无法识别整数和浮点值之间的区别,它将所有数字视为相同,因为JavaScript将所有数字表示为64位浮点,无论它们的基础BSON类型。
然而,大多数MongoDB language drivers区分了整数和浮点类型。