Rails3: проверить максимальную длину текста перед сохранением в БД

В настоящее время я использую «магазин» в своей модели Rails для сохранения различных вещей в хеше. Это удобно, поскольку мне не нужно создавать множество отдельных атрибутов для этих данных, они сериализуются/десериализуются за меня, и я могу легко получить доступ к каждому из отдельных хеш-атрибутов по мере необходимости. Фрагмент кода (упрощенный):

class Request < ActiveRecord::Base
  attr_accessible :data

  # Data is a nested hash
  store :data

  # Validation
  validates_presence_of :data
end

Я понимаю, что этот дизайн может быть не идеальным, когда/если :data становится очень большим (совершенно другая тема), но тем временем я хотел бы знать следующее:

  1. Каков максимальный размер столбца «текст» по умолчанию? В настоящее время я использую базу данных PostGres, и я полагаю, что она использует VARCHAR за кулисами, но не уверен, какой максимальный размер для этого столбца на самом деле находится в базе данных?
  2. Могу ли я явно установить максимальный размер для этого текстового столбца :data в моем коде create_table миграции Rails?
  3. Что сделает Rails, если я попытаюсь сохранить запись, в которой этот атрибут :data слишком велик? Исследования приводят меня к мысли, что он нарежет его и сохранит то, что может поместиться (очень плохо!)
  4. Как лучше всего защититься от потенциального повреждения хэша и проверить: размер данных ‹ МАКСИМАЛЬНО допустимый размер перед сохранением в БД?

person Gusto    schedule 01.11.2012    source источник


Ответы (1)


установите максимальную длину в вашей миграции

http://databasically.com/2011/03/01/a-limit-of-rails-migrations/

затем подтвердите длину в вашей модели

http://guides.rubyonrails.org/active_record_validations_callbacks.html#length

person Brett    schedule 01.11.2012
comment
Спасибо, это отвечает № 2 и легко реализуемо для № 4. - person Gusto; 02.11.2012
comment
Тем не менее, мне все еще любопытно, знает ли кто-нибудь, что Rails создает с помощью миграции в PostGres (фактический PG SQL) для «текстового» типа и каков максимальный размер по умолчанию? - person Gusto; 02.11.2012
comment
Что касается № 3, при наличии проверки это никогда не будет проблемой. Однако я считаю, что если длина ваших данных превышает максимальную длину, может быть, это вызовет ошибку? Почему бы просто не попробовать и не увидеть? - person Brett; 02.11.2012
comment
Да, я проверил ошибку проверки, когда я явно установил ограничение на что-то маленькое. Однако у меня не было времени создать правильный тест, который автоматически генерирует что-то действительно большое, чтобы увидеть, каков максимальный размер по умолчанию (когда я не устанавливаю предел). Я предполагаю, что MAX по умолчанию довольно большой ... - person Gusto; 03.11.2012
comment
На SO есть ответ на № 1: stackoverflow.com/questions/10395975/ То есть максимальная длина, которую можно сохранить, составляет 1 ГБ. - person A. Wilson; 12.02.2013