Подтвердить что ты не робот

Как реализовать наследование Active Record в Ruby on Rails?

Как реализовать наследование с активными записями?

Например, мне нужен класс Animal, класс Dog и класс Cat.

Как будет отображаться модель и сопоставление таблиц базы данных?

4b9b3361

Ответ 1

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/

Ответ 2

Модели:

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

Ответ 3

ActiveRecord поддерживает сопоставление иерархий наследования с одной таблицей (Наследование с одной таблицей. В таблице будет столбец type, который хранит имя фактического класса и используется для выбора других столбцов класса.

Можно реализовать сопоставление наследования нескольких таблиц, как показано здесь, но этот конкретный способ не переносится, AFAIK.