2010-08-17 10 views
13

Attualmente sto lavorando a un'applicazione Rails 3 che potrebbe aver bisogno di utilizzare l'ereditarietà delle tabelle di classe per un paio di modelli.Ereditarietà delle tabelle di classe in Rails 3

Un esempio semplificato di ciò che sta succedendo è questo.

Ho una classe denominata Persona con attributi generali come nome, email, password comuni a tutti i tipi di persone nell'applicazione e utilizzati per l'autenticazione.

Ci sono due sottoclassi a Persona (o due tipi di persone ...), Driver e Passeggero. Entrambe queste sottoclassi condividono gli attributi generici di Person ma poi hanno attributi aggiuntivi specifici che sono unici per loro stessi. (ad esempio un autista può avere molti veicoli e licenze ma un passeggero non lo farebbe)

Come implementare CTI per questo tipo di situazione? Ho cercato un esempio fornito qui:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

Ma non specula su come accedere gli attributi comuni di una persona da un oggetto Autista o Passeggeri e io sono un po 'confuso da quella.

In particolare, quello che vorrei sapere è:

Se sto aggiornando gli attributi di un driver, come posso facilmente accedere e aggiornare gli attributi rilevanti sul tavolo padre people? Devo collegarmi ad un callback after_save e separare quale aggiornamento di attributo va dove? O c'è un modo migliore per avvicinarsi a questo?

+0

Vorrei aggiungere che questo è un esempio semplificato di ciò che sta realmente accadendo nella mia app. Sono sicuro di aver bisogno di implementare l'ereditarietà delle tabelle di classe nella mia situazione, l'ereditarietà a tabella singola non sarebbe il modo migliore. –

+0

ho messo un commento sul blog ho fatto riferimento nella mia interrogazione e l'autore ha gentilmente fornito un esempio di un modo per farlo: http://rhnh.net/2010/08/17/updating-class-table-inheritance- tavoli (you rock Xavier!) –

risposta

5

perché non utilizzare l'ereditarietà tabella singola? per esempio:

class Person < ActiveRecord::Base 
    # some common code here 
end 

class Driver < Person 
    # Driver code 
end 

class Passenger < Person 
    # Passenger code 
end 

in questo modo si avrà una persona classe comune, oltre a due specifiche classi derivate da essa

+13

Nota: il PO ha chiesto su come utilizzare classe ereditarietà delle tabelle, non single Table Inheritance. –

+21

a volte le persone chiedono la domanda sbagliata, ho appena risposto ad una possibile soluzione al suo problema. –

+9

Quindi dovrebbe essere suggerito come commento. – EdMelo

4

sto usando il plugin ereditarietà delle tabelle di classe e funziona bene, http://github.com/brunofrank/class-table-inheritance

+0

Grazie per il suggerimento, controllerò il plugin! –

+4

Non è la soluzione migliore, perché non funziona bene con postgres (cioè, non usare questo se si intende usare heroku con postgres) – standup75

2

Recentemente ho biforcato un progetto promettente per implementare ereditarietà di più tabelle e ereditarietà di classe in Rails. Ho trascorso alcuni giorni sottoponendoli a sviluppo rapido, correzioni, commenti e documentazione e l'ho ripubblicato come CITIER (Ereditarietà di classe e ereditarietà di tabelle per le rotaie).

Penso che potresti potenzialmente combinarlo con le risposte sopra?

consideri dando un aspetto: http://peterhamilton.github.com/citier

ho guardato soluzioni come il repo di classe-table-eredità, ma questo è molto più pulito e più logico IMO.

Supporta anche i linguaggi SQL principali SQLite, MySQL, PostgreSQL e probabilmente più ma non li ho testati.

+0

Questa gemma sembra essere la più completa delle tre funzioni. Posso chiederti se hai esaminato il confronto delle prestazioni? E anche l'integrazione con Sunspot (visto che vengono usate le viste db)? – lulalala

+0

Funziona alla grande ... ma abbiamo avuto un sacco di problemi con heroku. Non ha gradito le visualizzazioni del tavolo, specialmente quando si spinge/tira il db. Finito per rimuoverlo. – Ricky

7

Inoltre v'è un plugin 'acts_as_relation' per fare questo,
https://github.com/hzamani/acts_as_relation/

nel tuo caso il codice sarà questa:

class Driver < ActiveRecord::Base 
    acts_as :person 
end 

class Passenger < ActiveRecord::Base 
    acts_as :person 
end 

Non dimenticare di aggiungere person_type e person_id colonne persons tabella.
Ora sia Drive e ereditano passeggeri persona attributi, convalide e metodi.

Problemi correlati