С имеющейся у меня схемой БД с изменением типа юзера проблем нет, но есть пара нюансов. При смене типа пользователя нужно удалить текущую запись пользователя во вспомогательной таблице его текущего типа, создать новую запись во вспомогательной таблице его нового типа, и обновить тип и айди в основной таблице user_logins. Нюанс в том, что это должно быть атомарной транзакцией, но ActiveRecord.transaction легко позволяет это сделать. Еще нюанс - при изменении типа пользователя, ID доп. таблиц будут бессмысленно инкрементироваться, еще раз показывая, что было бы неплохо избавиться от этих лишних ключей.
Для обработки этих действий я создал контроллер user_logins_controller, обеспечивающий стандартный RESTful функционал для user_logins(без добавления и удаления). Доступ туда все теми же стандартными фильтрами ограничивается для всех, кроме админов. При переходе на edit, грузится форма с одним единственным выпадающим списком с типами пользователей. При сабмите проверяется, изменился ли тип, и если изменился, то происходит операция замены типа пользователя. Так как атрибуты у них разные, и многие из них валидируются на наличие, то тип пользователя я проверяю через case и для каждого типа создаю новую запись с требуемыми атрибутами. Второй нюанс в том, что при смене типа удаляются старые данные пользователя. Сейчас я это никак не обрабатываю, т.е. просто удаляю старую запись, и создаю новую, заполняя требуемые атрибуты строкой "change this". В реальной системе так делать не вариант. Можно, например, сделать дополнительное поле changed?, делать его true при изменении типа пользователя, и при следующем логине пользователя, если оно true, просить ввести новые данные.
Еще мне пришлось изменить связь владельцев магазинов с товарами. Изначально я сделал связь один ко многим между продавцом и товарами, это казалось мне логичней, чем для каждого товара иметь поле магазин. Но при случае изменения типа пользователся какого-нибудь владельца магазина, его товары бы либо оставались не привязанными к магазину, либо же просто удалялись, если бы связь была dependent: :destroy. Поэтому я убрал связь shop_owner - product, и добавил автоматически заполняемое поле shop_name в таблицу products.