6

dicono, se abbiamo generato un modelloIn Ruby on Rails, se abbiamo generato un modello "Animale" e ora vogliamo avere "Cane", come dovremmo farlo?

rails generate model animal name:string birthday:date 

e ora vogliamo creare un altro modello di ereditare da essa (come ad esempio cani e gatti), dovremmo usare rails generate model di nuovo o semplicemente aggiungere i file noi stessi? Come possiamo specificare che Dog dovrebbe ereditare da Animal se usiamo rails generate model?

Penso che se usiamo rails generate model invece di aggiungere noi stessi i file del modello, ci saranno anche file di test unitari e file di fissaggio creati per noi. Viene aggiunto anche un file di migrazione, tranne se sta utilizzando MongoDB, quindi non ci sarà alcun file di migrazione.

risposta

2

Per quanto ne so non è possibile specificare una superclasse durante la generazione di un modello. Tuttavia, i generatori sono solo un trampolino di lancio per creare le tue lezioni. È possibile generare la classe del modello come normale e cambiare semplicemente la superclasse nel file del modello generato. Non ci sono altri luoghi in cui la relazione di ereditarietà debba essere specificata per il funzionamento dei file generati (le fixture e le unit test, ad esempio, non specificano super- o sottoclassi).

Quindi:

script/generate model Dog 

Poi cambiare:

class Dog < ActiveRecord::Base 

a:

class Dog < Animal 

Se si desidera generare un modello che erediterà da Animal utilizzando l'ereditarietà singola tabella allora si potrebbe voler specificare --skip-migrations sullo script/generare una chiamata (anche se potresti voler aggiungere una migrazione, ad es colonne specifiche del cane per la tabella degli animali e sarà necessario aggiungere una colonna di tipo type alla tabella animali).

+2

questo ha bisogno di una stringa colonna na med 'type' per essere presente in' Animal'. – Swanand

+0

Buona chiamata, aggiornata. – Shadwell

7

Se gli altri Dog, Cat e sottoclassi che si prevede non stanno andando a divergere da Animal modello, è possibile STI (Single Table Inheritance) modello qui.

Per fare questo, aggiungere una colonna String-Animal. E allora si può avere:

class Dog < Animal 
end 

class Cat < Animal 
end 

>> scooby = Dog.create(:name => 'Scooby', :date => scoobys_birthdate) 
=> #<Dog id: 42, date: "YYYY-MM-DD", type: "Dog"> 

Per generare modello Dog

$ script/generate model Dog --skip-migration 

e quindi modificare (di solito app/models/dog.rb):

class Dog < ActiveRecord::Base 

a

class Dog < Animal 
+0

vedo ... che dire se c'è una proprietà aggiuntiva con questa classe, come 'fur_color: string'? come influenza il 'generate' e le tabelle? –

+0

Se aggiungi una nuova colonna, dì "fur_color" come dici tu, sarà disponibile per tutte le sottoclassi. Potrebbe non avere senso sempre, ad es. hai 'classe Snake Swanand

+4

È possibile definire la superclasse durante la generazione di un modello specificando un flag '--parent'. Vedi [questo] (http://stackoverflow.com/a/14569424) post. Né genererà alcuna migrazione, da quello che ho osservato. –

Problemi correlati