Как перенести столбец whodunnit paper_trail из строки в целое число? - PullRequest
0 голосов
/ 26 ноября 2018

В устаревшем приложении Rails, использующем paper_trail, для столбца whodunnit задано значение string, и вместо значения по умолчанию current_user.id в этом столбце содержится электронная почта пользователя.Это достигается путем переопределения user_for_paper_trail в ApplicationController:

def user_for_paper_trail
  current_user.email
end

Теперь я хочу перейти к стандартному поведению хранения идентификатора текущего пользователя вместо электронной почты.

Таким образом, подход, который я собирался применить, был примерно таким:

  • добавить новый целочисленный столбец в таблицу versions, возможно, с именем whodunnit_new;
  • remove user_for_paper_trailметод в контроллере приложения и скажите моделям записать информацию whodunnit в whodunnit_new вместо whodunnit.Это означает, что для новых версий paper_trail сохраняет id в whodunnit_new и не сохраняет email в whodunnit;
  • backfill whodunnit_new для старых записей, находя пользователя по электронной почте исохранение идентификатора их в новом столбце;
  • перетаскивание столбца whodunnit;
  • переименование whodunnit_new в whodunnit и удаление настроек в моделях для использования whodunnit_new.

Проблема в том, что я не смог найти параметр, который мог бы задать имя столбца whodunnit, мне кажется, что он жестко запрограммирован.Я видел, что есть псевдоним для метода whodunnit (называемый version_author).

Я использую Papertrail 10 и Rails 5.2.

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

1 Ответ

0 голосов
/ 12 декабря 2018

.. Мне не удалось найти параметр, в котором можно задать имя столбца whodunnit, как мне кажется, это жестко запрограммировано.

Правильно,столбец должен быть назван whodunnit.Это не настраивается.

В противном случае ваша миграция звучит хорошо.Используйте транзакцию, и вам не нужно будет временно переименовывать столбец.(Если вы не используете MySQL, который имеет «слабые» транзакции, т.е. не защищен от DDL)

...