2009-12-08 8 views
1

J'ai un couple de modèles qui partagent un has_many associations, des portées nommées et des validations.Sécher mes modèles de rails

Quelle est la meilleure façon de sécher ces modèles afin qu'ils puissent partager le même code?

Créer une classe parente et en hériter ces modèles ou serais-je mieux de créer un module?

C'est le type de code Je cherche à tarir:

has_many :comments, :as => :commentable 

has_permalink :title 

validates_presence_of :title 

has_attached_file :image 

J'ai déjà pensé que je peux l'utiliser dans un module pour gérer les associations has_many mais lorsque je tente quelque chose de similaire avec has_permalink ou has_attached_file alors les choses tombent en panne.

def self.included(klass) 
    klass.has_many :comments, :as => :commentable 
end 
+0

J'ai utilisé l'héritage avec succès. Mais peut-être serait-il utile de montrer quelques exemples? – nathanvda

Répondre

3

Vous devez utiliser l'héritage que si les modèles sont true subtypes d'un certain type de parent, plutôt que comme un moyen pratique de partager le code. Contrairement à certaines langues, Ruby a le mécanisme de module pour ce dernier.

+0

Merci John. Cela ressemble à un module est le chemin à parcourir. – KJF

3

L'héritage des rails implique une structure de base de données partagée, et pas seulement la commodité. Donc, comme l'a dit John, vous ne voulez vraiment le faire que quand ils sont si proches qu'ils peuvent partager la même table avec quelques champs supplémentaires collés ici et là.

Si vous n'êtes pas à la recherche d'un héritage à table unique, le fait de mixer dans un module est certainement une excellente façon de procéder et c'est super facile. :)

+0

Merci, j'ai essayé la route du module et j'ai eu un certain succès avec le tarissement des associations has_many mais ça tombe en panne si j'essaye de faire sécher d'autres codes de la même manière. – KJF