Странное поведение модели ActiveRecord

у меня есть модель

class Owner < ActiveRecord::Base
  attr_accessible :telephone
  validates_uniqueness_of :telephone
  validates_telephone_number_of :telephone
  before_validation :telephone_normalize
end

в консоли рельсов

a = Owner.new(:telephone => '949123456')
=> #<Owner id: nil, telephone: "949123456", created_at: nil, updated_at: nil> 
1.9.3-p362 :002 > a.valid?
Owner Exists (0.1ms)  SELECT 1 AS one FROM "owners" WHERE "owners"."telephone" = '+421949123456' LIMIT 1
=> false
1.9.3-p362 :003 > a
=> #<Owner id: nil, telephone: "421949123456", created_at: nil, updated_at: nil>

То же самое, когда я сохраняю уникальный номер:

1.9.3-p362 :006 > a.telephone = '949123457'
=> "949123457" 
1.9.3-p362 :007 > a.save
(0.1ms)  begin transaction
Owner Exists (0.2ms)  SELECT 1 AS one FROM "owners" WHERE "owners"."telephone" = '+421949123457' LIMIT 1
SQL (2.3ms)  INSERT INTO "owners" ("created_at", "telephone", "updated_at") VALUES (?, ?, ?)  [["created_at", Wed, 16 Jan 2013 11:55:44 UTC +00:00], ["telephone", "421949123457"], ["updated_at", Wed, 16 Jan 2013 11:55:44 UTC +00:00]]
(88.3ms)  commit transaction
=> true

Rails (3.2.11) опускает «+» в начале номера. Тип номера — строка. Так же сохраняет без плюса (если он уникален), но при валидации вызывает со знаком плюс.

Что я делаю не так?


person Ivan Stana    schedule 16.01.2013    source источник


Ответы (2)


Он считает, что столбец telephone в базе данных имеет тип integer. Таким образом, строка, которую вы передали, выходит за пределы допустимого диапазона. Вот почему вы столкнулись с этой проблемой.

person Sachin R    schedule 16.01.2013

К сожалению, в моем валидаторе validates_telephone_number_of была ошибка. У него был изменен атрибут :-/

Сказать

> a = 'aaa' # => 'aaa'
> b = a.to_s # => 'aaa'
> b << 'c' # => 'aaac'
> b  # => 'aaac'
> a  # => 'aaac'

Необходимо использовать b = a.to_s.dup.

person Ivan Stana    schedule 16.01.2013