2014-10-26 2 views
3

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

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

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

+0

Я думаю, что мы не можем установить ограничение на целые числа при переносе, вместо этого вы можете проверить 'validates_length_of' перед сохранением записи в db, и там вы можете указать длину чисел, которые вы хотите разрешить для этого конкретного поля, как это:' validates_length_of: phone_number ,: максимум => 8' – anusha

ответ

5

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

Так сделать свой 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 
0

Или вы можете сделать это с мв сердечником gem (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 

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

Смежные вопросы