Rails add_column с ограничением и по умолчанию с функцией Postgres

Я пытаюсь добавить столбец, который по умолчанию использует сгенерированный UUID без дефисов в виде varchar(32). В настоящее время это то, что имеет моя миграция:

add_column :users, :uuid, :string, limit: 32, default: "REPLACE(uuid_generate_v4(), '-', '')"

Но, похоже, это ошибка, потому что он просто устанавливает это как текст строки:

PG::StringDataRightTruncation: ОШИБКА: слишком длинное значение для изменяющегося символа типа(32)

Кажется, я не могу найти надлежащую документацию по установке значения по умолчанию для инструкции sql, но это может быть проще сделать в Rails 5 (https://github.com/rails/rails/pull/20005)


person Tom Prats    schedule 12.04.2016    source источник


Ответы (1)


ОБНОВЛЕНИЕ

Ну, я смог найти твой ответ. Active Record (очевидно) имеет некоторую поддержку postgresql. Если вы используете postgresql 9.4+ и Active Record, вы можете использовать UUID в своей схеме. Здесь есть официальное руководство по Rails, в котором описано, как это сделать.

ИСХОДНЫЙ ОТВЕТ

Я не знаю, как установить это на уровне базы данных, но вы можете добавить значение по умолчанию в модель Active Record используя обратный вызов следующим образом:

class Model < ActiveRecord::Base
  before_create do
    if self.uuid.nil?
      self.uuid = REPLACE(uuid_generate_v4(), '-', '')
    end
  end
end
person John    schedule 13.04.2016
comment
Будет ли это работать? В моем примере были функции postgres, а не ruby, но то, как я это делаю в ruby, - это before_create (поэтому запускается только один раз) с self.uuid ||= SecureRandom.uuid.gsub("-", "") (||, чтобы вы могли установить его вручную). Меня в основном просто интересует возможность сделать это на стороне postgres. - person Tom Prats; 13.04.2016
comment
Вы совершенно правы, перед проверкой не сработает, так как она также сработает при обновлении. Я понятия не имею о функции, я просто скопировал из вашего примера. При этом, поскольку вы используете postgresql (о чем свидетельствует ваше заявление об ошибке), я нашел ваше решение и обновил свой ответ. - person John; 13.04.2016
comment
Ничего себе, прочитав всю эту ссылку, Active Record действительно поддерживает множество специфических функций postgresql. - person John; 13.04.2016
comment
Поскольку у вас, очевидно, есть некоторые знания sql, не предполагайте, что вы знаете ответ на этот вопрос, который я задал ранее? stackoverflow.com/questions/36580266/ - person John; 13.04.2016