не могу понять причины - PullRequest
3 голосов
/ 27 июля 2010

считают, что у меня есть миграция следующим образом

create_table :dummies do |t|
  t.decimal :the_dummy_number
end 

я создаю экземпляр как следующий

dummy = Dummy.new
dummy.the_dummy_number = "a string"
puts dummy.the_dummy_number

выход для вышеупомянутого

 0.0

как это случилось? так как я назначаю неправильное значение, не должно ли это вызвать ошибку?

Самая большая проблема заключается в следующем.

Так как он автоматически конвертирует мой метод проверки , он терпит неудачу.

обновление - метод проверки

 validate :is_dummy_number_valid, :the_dummy_number
 def is_dummy_number_valid
    read_attribute(:the_dummy_number).strip()
 end

1 Ответ

3 голосов
/ 27 июля 2010

Причина, по которой это не работает так, как вы ожидаете, заключается в том, что базовая реализация BigDecimal в ruby ​​не выдает ошибку при передаче строки.

Рассмотрим следующий код

[ 'This is a string', '2is a string', '2.3 is also a string', 
  '   -3.3 is also a string'].each { |d| puts "#{d} = #{BigDecimal.new(d)}" }

This is a string = 0.0
2is a string = 2.0
2.3 is also a string = 2.3
   -3.3 is also a string = -3.3

Таким образом, BigDecimal сканирует строку и присваивает что-либо в начале строки, которое может быть десятичным в ее значении.

Если вы настроите свою модель следующим образом

class Dummy < ActiveRecord::Base

   validates_numericality_of :the_dummy_number

end

Тогда проверка должна работать нормально

>> d=Dummy.new(:the_dummy_number => 'This is a string')
=> #<Dummy id: nil, the_dummy_number: #<BigDecimal:5b9230,'0.0',4(4)>, created_at: nil, updated_at: nil>

>> puts d.the_dummy_number
0.0
=> nil
>> d.valid?
=> false

>> d.errors
=> #<ActiveRecord::Errors:0x5af6b8 @errors=#<OrderedHash
  {"the_dummy_number"=>[#<ActiveRecord::Error:0x5ae114 
   @message=:not_a_number, @options={:value=>"This is a string"}

Это работает, потому что макрос validates_numericity_of использует метод raw_value, чтобы получить значение до того, как оно было приведено к типу и присвоено внутреннему десятичному значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...