Наследование классов таблицы в Rails 3

В настоящее время я работаю над приложением Rails 3, которое выглядит так, как будто, возможно, потребуется использовать Class Table Inheritance для нескольких моделей.

Упрощенный пример того, что происходит, это.

У меня есть класс под названием Person с общими атрибутами, такими как имя, адрес электронной почты, пароль, которые являются общими для всех типов людей в приложении и используются для аутентификации.

Есть два подкласса для Лица (или двух типов людей...), Драйвера и Пассажира. Оба этих подкласса разделяют общие атрибуты Person, но затем имеют специальные дополнительные атрибуты, которые являются уникальными для себя. (например, водитель может иметь много транспортных средств и лицензий, но пассажир не будет)

Как мне реализовать CTI для такой ситуации? Я смотрю пример, приведенный здесь:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

Но он не размышляет о том, как получить доступ к общим атрибутам Person из объекта Driver или Passenger, и я немного смущен этим.

В частности, я хотел бы знать:

Если я обновляю атрибуты драйвера, как я могу легко получить доступ и обновить соответствующие атрибуты в таблице родительских людей? Должен ли я подключаться к обратному вызову after_save и выделять, какое обновление атрибутов происходит там? Или есть лучший способ приблизиться к этому?

Ответы

Ответ 1

Также есть плагин 'act_as_relation', чтобы сделать это,
https://github.com/hzamani/acts_as_relation/

в вашем случае код будет следующим:

class Driver < ActiveRecord::Base
   acts_as :person
end

class Passenger < ActiveRecord::Base
  acts_as :person
end

Не забудьте добавить столбцы person_type и person_id в таблицу persons.
Теперь оба диска и пассажира наследуют атрибуты Person, проверки и методы.

Ответ 2

почему бы не использовать одностраничное наследование? например:

class Person < ActiveRecord::Base
   # some common code here
end

class Driver < Person
   # Driver code
end

class Passenger < Person
   # Passenger code
end

таким образом у вас будет общий класс Person, плюс два конкретных класса, полученные из него

Ответ 4

Недавно я разработал многообещающий проект для реализации множественного наследования таблиц и наследования классов в Rails. Я провел несколько дней, подвергая его быстрой разработке, исправлениям, комментариям и документации и повторно выпустил их как CITIER (Наследование классов и наследование наследования для Rails).

Я думаю, вы могли бы объединить его с ответами выше?

Рассмотрите возможность взглянуть на это: http://peterhamilton.github.com/citier

Я рассматривал такие решения, как репозиторий наследования класса-таблицы, но это намного чище и логичнее ИМО.

Он также поддерживает основные SQL-языки SQLite, MySQL, PostgreSQL и, возможно, больше, но я не тестировал их.