当给出字符串时,Mongoid将浮点值放在字段上

时间:2013-07-29 14:30:15

标签: validation mongoid

我正在使用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值?我期待验证错误。

2 个答案:

答案 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
# ...

鉴于此,字段heightweight填充了0.0,因为使用StringFloat转换为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区分了整数和浮点类型。

来自 - &gt; Does MongoDB support floating point types?