Jak zaimplementować dziedziczenie z aktywnymi rekordami?Jak zaimplementować dziedziczenie Active Record w Ruby on Rails?
Na przykład chcę mieć klasę Animal, klasa Dog i klasę Cat.
Jak wyglądałby model i tabela bazy danych?
Jak zaimplementować dziedziczenie z aktywnymi rekordami?Jak zaimplementować dziedziczenie Active Record w Ruby on Rails?
Na przykład chcę mieć klasę Animal, klasa Dog i klasę Cat.
Jak wyglądałby model i tabela bazy danych?
Szyny obsługują dziedziczenie pojedynczego stołu.
Z AR docs:
Active Record pozwala na dziedziczenie przez przechowywania nazwę klasy w kolumnie że domyślnie jest nazwany „typ” (może być zmieniony poprzez nadpisanie Base.inheritance_column) . Oznacza to, że dziedziczenie wygląda tak:
class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end
Kiedy robisz Firm.create (: name => "37Signals"), ten rekord zostanie zapisany w tabeli z firm typu = „Firma ". Następnie możesz pobrać ten wiersz ponownie za pomocą Company.find (: first, "name = '37signals'") i zwróci obiekt firmy.
Jeśli nie masz kolumny typu zdefiniowanej w tabeli, dziedziczenie pojedynczego zbioru nie zostanie uruchomione. W tym przypadku będzie działał tak jak normalne podklasy bez specjalnej magii dla rozróżniania między nimi lub przeładowywania odpowiedniego typu z findem.
całkiem dobry tutorial jest tutaj: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/
Modele:
class Animal < ActiveRecord::Base; end
class Dog < Animal; end
class Cat < Animal; end
migracji.
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 obsługuje hierarchie Mapowanie dziedziczenia jednej tabeli (Single-table inheritance Tabela będzie mieć kolumnę type
, która przechowuje nazwę a ctual class i służy do wybierania innych kolumn specyficznych dla klasy.
Możliwe jest zaimplementowanie mapowania dziedziczenia wielostolikowego, jak pokazano here, ale ten szczególny sposób nie jest przenośny, AFAIK.
możesz chcieć zaakceptować odpowiedź –