Наследование таблиц классов в Rails 3 - PullRequest
13 голосов
/ 17 августа 2010

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 13 июня 2011

Также для этого есть плагин 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.
Теперь и Drive, и Passenger наследуют атрибуты Person, проверки и методы.

5 голосов
/ 17 августа 2010

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

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

class Driver < Person
   # Driver code
end

class Passenger < Person
   # Passenger code
end

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

4 голосов
/ 21 октября 2010

Я использую плагин наследования таблиц классов, и он работает хорошо, http://github.com/brunofrank/class-table-inheritance

2 голосов
/ 29 апреля 2011

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

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

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

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

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

...