Как реализовать наследование с активными записями?
Например, мне нужен класс Animal, класс Dog и класс Cat.
Как будет отображаться модель и сопоставление таблиц базы данных?
Как реализовать наследование с активными записями?
Например, мне нужен класс Animal, класс Dog и класс Cat.
Как будет отображаться модель и сопоставление таблиц базы данных?
Rails поддерживает одностраничное наследование.
Из AR docs:
Активная запись позволяет наследовать сохранение имени класса в столбец, который по умолчанию называется "тип", (может быть изменено путем перезаписи Base.inheritance_column). Это означает что наследование выглядит следующим образом:
class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end
Когда вы выполните Firm.create(: name = > "37signals" ), эта запись будет сохранен в таблице компаний с типом = "Фирма". Затем вы можете снова взять эту строку, используя имя Company.find(: first, "name = '37signals" ), и он вернет объект Firm.
Если у вас нет столбца типа определенные в вашей таблице, таблица с одним столом наследование не будет инициировано. В в этом случае он будет работать как обычно подклассы без специальной магии для дифференциация между ними или перезагрузите нужный тип с помощью find.
Здесь довольно хороший учебник: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/
Модели:
class Animal < ActiveRecord::Base; end
class Dog < Animal; end
class Cat < Animal; end
Миграция:
class CreateAnimals < ActiveRecord::Migration
def self.up
create_table :animals do |t|
# Other attributes...
t.string :type
end
end
def self.down
drop_table :animals
end
end
ActiveRecord поддерживает сопоставление иерархий наследования с одной таблицей (Наследование с одной таблицей. В таблице будет столбец type
, который хранит имя фактического класса и используется для выбора других столбцов класса.
Можно реализовать сопоставление наследования нескольких таблиц, как показано здесь, но этот конкретный способ не переносится, AFAIK.