4

Ruby 1.9.3-p448 と Rails 3.2.13 を使用しています。float 形式の検証を使用したこの単純なモデルがあります。

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 の値を入力するのはなぜですか? 検証エラーが発生することを期待していました。

4

2 に答える 2

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

それを考えると、 s はメソッドを使用して変換されるため、フィールドheightweightは次のように動作します。0.0StringFloatto_f

'foo'.to_f
# => 0.0

さらに、正規表現を使用して浮動小数点フィールドを検証しても意味がありFloatません。これは、検証の前に への変換が実行されるためです。次の動作により、検証は常に失敗します=~

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.
# ...
于 2013-07-29T15:20:38.830 に答える
-1

MongoDB は、次の数値データ型をサポートする BSON と呼ばれるバイナリ形式でデータを格納します。

  • int32- 4 バイト (32 ビット符号付き整数)
  • int64- 8 バイト (64 ビット符号付き整数)
  • double- 8 バイト (64 ビット IEEE 754 浮動小数点)

MongoDB には、mySQL の 10 進数型に相当する正確な値の固定小数点はありませんが、Mongo では 64 ビットの浮動小数点数を double として格納できます。

JavaScript シェルである MongoDB シェルは、整数値と浮動小数点値の区別を認識しないことに注意してください。JavaScript は、基になる BSON に関係なく、すべての数値を 64 ビット浮動小数点として表すため、すべての数値を同じように扱います。タイプ。

ただし、ほとんどのMongoDB 言語ドライバーは、整数型と浮動小数点型を区別しています。

From -> MongoDB は浮動小数点型をサポートしていますか?

于 2013-07-29T14:41:15.250 に答える