2009-10-21 10 views

Odpowiedz

66

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/

15

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 
6

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.