Ruby on Rails: Vererbung

Sagen wir, wir bauen eine Terminverwaltung. Es gibt die abstrakte Basisklasse BusinessDate. Davon werden SingleDate und CompoDate abgeleitet. Wie realisiert man die Datenstrukturen?

Nun, Vererbung wird in Rails meistens als Single-Table-Inheritance (kurz STI) realisiert. Die Alternative sind polymorphe Assoziationen.

STI Bearbeiten

Für STI legt man eine Tabelle an, die Felder aller Klassen enthält. Normalerweise heißt sie so wie die Basisklasse mit Plural-"s", also hier business_dates. Legen wir sie an:

class CreateBusinessDates < ActiveRecord::Migration
  def self.up
    create_table :business_dates do |t|
      t.date :start
      t.date :end
      t.string :location
      t.string :title
      t.string :short_description
      t.text :long_description
      t.integer :color
    end
  end

  def self.down
    drop_table :business_dates
  end
end

Für die Vererbung brauchen wir noch ein weiteres Feld für den Klassennamen. Es heißt "type" und ist ein String-Feld. Fügen wir es hinzu.

class AddInheritedDates < ActiveRecord::Migration
  def self.up
    add_column :business_dates, :type, :string 
  end

  def self.down
    remove_column :business_dates, :type
  end
end

Jetzt können wir die Klassen definieren.

class BusinessDate < ActiveRecord::Base
end

class SingleDate < BusinessDate
end

class CompositeDate < BusinessDate
end

Fertig, den Rest übernimmt Rails.

  • ergänzen. (Z.B.: Code mit STI-Objecten)

Polymorphe Assoziationen Bearbeiten

  • Nachteile von STI
  • Polymorphe Assoziationen als Alternative

Statt einer Zusammenfassung Bearbeiten

Sie haben STI nicht richtig verstanden, wenn ..

  • Sie glauben, dass jede abgeleitete Klasse alle Felder benutzen MUSS.

..

  • ..