Конвертировать модель в рельсы (Single Table Inheritance) - PullRequest
2 голосов
/ 24 января 2012

Допустим, у меня есть два типа пользователей: A и B. Пользователи типа B имеют меньше привилегий и менее строгие проверки полей (больше может быть пустым). В остальном они в основном совпадают с типом A. Этот факт заставляет меня склоняться к наследованию одной таблицы.

Вот мое беспокойство - тип B пользователи могут обновить до типа A. При обновлении они должны хранить все связанные с ними записи. Существует ли простой способ преобразования одного типа модели в другой с использованием STI, чтобы все ассоциации были сохранены? Можете привести простой пример?

Ответы [ 2 ]

3 голосов
/ 25 января 2012

Все, что вам нужно сделать, это убедиться, что вы указали правильное значение в столбце type.

При обновлении пользователя B до пользователя A просто измените значение, сохраненное в атрибуте type, на пользователя A

имя класса.

Например:

 class Staff < ActiveRecord::Base; end
 class PartTimeStaff < Staff; end

 part_time_staff = PartTimeStaff.first
 part_time_staff.type = "Staff"
 part_time_staff.save

повысит количество сотрудников, занятых неполный рабочий день, до класса персонала.

Все ассоциации должны остаться без изменений.Поскольку у вас есть только одна фактическая таблица sql.

Все атрибуты для классов PartTimeStaff и Staff хранятся в одной таблице.

Подробнее см. В Rails API и Наследование одной таблицы

спасибо

0 голосов
/ 25 января 2012

Может быть, у вас может быть только одна модель пользователя с полем типа, и проверки зависят от типа.

class User
  validates :name, presence: true, if: :advanced_user?

  protected

  def advanced_user?
    self.type == 2
  end
end
...