2011-01-31 14 views
7

Ho due modelli, Articolo e Ricetta, che hanno molti degli stessi attributi e metodi. Voglio creare sottoclassi di una nuova classe "Post" e spostare tutta la loro logica condivisa, quindi non sto mantenendo il codice duplicato. Ho provato questo:Modelli di sottoclassi in Rails

class Recipe < Post; end 
class Article < Post; end 
class Post < ActiveRecord::Base 
    #all the shared logic 
end 

Tutte queste classi si trovano nella cartella standard ./app/models. Questo codice, tuttavia, genera un errore ActiveRecord :: StatementInvalid quando si accede a/articles/new, ad esempio. L'errore è:

Impossibile trovare la tabella 'messaggi'

Qualsiasi idea di come impostare questa funzione?

+1

Ma hai elaborato il tavolo 'post'? – Matt

risposta

9

Perché non usi i moduli?

module Features 
    def hello 
    p "hello" 
    end 
end 

class Recipe < ActiveRecord::Base 
    include Features 
end 

class Article < ActiveRecord::Base 
    include Features 
end 


Recipe.new.hello 
# => "hello" 

Article.new.hello 
# => "hello" 
+0

Questo è perfetto. Sono nuovo alle rotaie e non sapevo di quelle. Basta leggere http://handyrailstips.com/tips/14-drying-up-your-ruby-code-with-modules e ha senso. Grazie! – weotch

13

Rails sta usando modello Single Table Inhritance di default (solo google per esso), in modo che quando si sta sottoclasse un modello, tutti i modelli risultanti useranno la stessa tabella di database (in questo caso posts). Puoi mettere tutti i tuoi metodi e convalide comuni nel modello Post e quelli specifici nelle altre classi, ma tutte quelle classi avranno accesso ai rispettivi campi, perché condividono la stessa tabella (non è comunque un grosso problema).

Se si desidera condividere il codice (metodi), è preferibile inserire alcuni metodi comuni in un modulo in un file nella directory lib e includerlo in ciascun modello. Oppure potresti mettere la definizione del modulo in alto se stai mantenendo tutti i modelli in un singolo file come nel tuo esempio.

+0

Grazie per aver incluso una spiegazione del perché! – ifightcrime