2011-07-05 3 views
2

modèle PostCréer une méthode pour la relation has_many?

has_many :comments 
has_mant :tags 

def comments? 
    !self.comments.empty? 
end 

def tags? 
    !self.tags.empty? 
end 

Pour vérifier poste spécifique a des commentaires ou des tags. J'ai écrit un commentaire de méthode d'instance? et les tags? qui retournera vrai ou faux sur la base de la poste a des commentaires et des étiquettes ou non.

Je veux écrire une méthode pour toute relation has_many qui fournira la méthode avec '?'. Donc, à l'avenir Si j'ai 10 relations has_many avec la poste que je n'ai pas besoin d'écrire 10 méthodes pour relation1 ?, relation2 ?.

Toute idée.

Répondre

5

Si vous voulez des méthodes définies dynamiquement, comme ActiveRecord fait pour diverses choses, vous pouvez le faire:

class Model 
    has_many :x 
    has_many :y 
    self.reflect_on_all_associations(:has_many).each do |association| 
    define_method "#{association.name}?" do 
     self.send(association.name).any? 
    end 
    end 
end 

Cela va créer des méthodes et :x?:y?. Vous pouvez le mettre dans un module et l'inclure dans les modèles dont vous avez besoin.

Edit: any? est le même que ! et empty?

+0

Merci pour le code. Pouvez-vous me dire comment je peux l'écrire dans le module? –

Questions connexes