2011-06-04 2 views
0

J'essaie d'inclure un module uniquement lorsqu'une condition est remplie.Rails Include Module on Condition

module PremiumServer 
    def is_premium 
    true 
    end 
end 

class Server 
    include Mongoid::Document 
    include PremiumServer if self.premium 
    field :premium, :type => Boolean, :default => false 
end 

Ce ne fonctionne pas, et je ne peux pas comprendre pourquoi. Quelqu'un peut-il me dire comment je suis censé inclure des modules basés sur une condition rencontrée, comme ci-dessus?

Merci!

EDIT:

J'ai trouvé la réponse à mon problème ici: Mongoid and carrierwave

Cependant, je suis attribution de la question à la partie supérieure réponse car il est probablement la façon plus utile.

+0

est une prime méthode d'instance ou d'un champ? Si c'est le cas, cela ne fonctionnera pas, car l'inclusion a lieu au niveau de la classe lorsqu'elle est chargée. –

Répondre

4

inclut arriver au niveau de la classe. Votre attribut premium est au niveau de l'instance.

Il existe des façons de faire le include sur le niveau d'instance, mais je ne les recommanderais pas.

Ici, vous êtes mieux d'utiliser l'héritage

class Server; .. ; end 
class PremiumServer < Server; ..; end 

Ou, dans votre cas, si la seule méthode est is_premium ajouter à la classe de serveur et ont le retourner la variable prime

def is_premium 
    self.premium 
end 

oh, et vous devriez utiliser la méthode "question" dans ruby ​​... Bien que Mongoid en fournit pour les valeurs booléennes.

def premium? 
    self.premium 
end 
0

Utiliser l'héritage de classe et le mécanisme de portée de MongoId:

class Server 
    include Mongoid::Document 
    field :premium, type: Boolean, default: false 
    # ... basic server methods 
end 

class PremiumServer < Server 
    default_scope :premium_servers, where(premium: true) 
    # ... additional premium server methods 
end 

p_server = PremiumServer.first 
p_server.<access to PremiumServer methods> 

Le default_scope sera utilisé chaque fois que vous faites une requête sur PremiumServer, vous n'avez pas besoin d'appeler .premium_servers manuellement.

C'est "basé sur la condition" d'une autre manière - de façon mongoïde.

Informations complémentaires: