Ограничить целочисленный размер в миграции Rails

Как указать ограничение на целочисленный размер при миграции на Rails 4? (Моя база данных — PostgreSQL.)

У меня есть поля для phone_number, которые должны состоять из 8 цифр. Если я укажу :limit => 8, то это размер в байтах, а не длина чисел.

Есть ли способ сделать это?


person Mel    schedule 26.10.2014    source источник
comment
Я думаю, что мы не можем установить ограничение на целые числа при миграции, вместо этого вы можете проверить validates_length_of перед сохранением записи в БД, и там вы можете указать длину чисел, которые вы хотите разрешить для этого конкретного поля, например: validates_length_of :phone_number, :maximum => 8   -  person anusha    schedule 27.10.2014


Ответы (2)


Ты все делаешь неправильно. Номер телефона — это не вообще число, номер телефона — это строка, содержащая (в основном) цифровые символы. Вы не делаете ничего числового — например, арифметического — с телефонными номерами, так что это не числа, а строки.

Итак, сделайте свой столбец phone_number строкой длины восемь:

t.string :phone_number, :limit => 8

и очистите его и подтвердите формат в своей модели:

before_validation :clean_up_phone_number
validates :phone_number, :format => { :with => /\A\d{8}\z/ }

def clean_up_phone_number
  # Do whatever you want or need to strip out spaces, hyphens, etc. in here
end
person mu is too short    schedule 27.10.2014

Или вы можете сделать это с помощью гема mv-core (https://github.com/vprokopchuk256/mv-core) прямо в миграции таким образом (синтаксис почти идентичен AciveModel::Validations one):

def change
  update_table :users do |table|
    t.string :phone_number, 
             validates: { length: 8, 
                          format: /\A\d{8}\z/,
                          allow_blank: true, 
                          allow_nil: true }
  end
end

А затем добавьте эту проверку к вашей модели:

class User < ActiveRecord::Base
  enforce_migration_validations
end

По умолчанию ваша проверка будет определена как ограничение CHECK для PostgreSQL. Но вы можете изменить это, чтобы активировать ограничение, например. Подробности смотрите в документации.

person Valera Prokopchuk    schedule 09.03.2015