2011-06-04 13 views
0

私は、条件が満たされたときにのみモジュールを含めるようにしています。条件にモジュールを含めるレール

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 

これは機能しません。理由はわかりません。誰かが、上記のような条件を満たすモジュールをどのように含めるべきか教えてください。

ありがとうございます!

EDIT:

私はここに私の問題への答えを見つけた:それはおそらくより有用な方法であるとしてMongoid and carrierwave

しかし、私はトップの答えに質問を授与しています。

+0

がインスタンスメソッドまたはフィールドプレミアムですか?そうであれば、これは動作しません。なぜなら、インクルード時にクラスレベルでインクルードが行われるからです。 –

答えて

4

は、クラスレベルで発生します。あなたのプレミアム属性はインスタンスレベルです。

インスタンスレベルでインクルードする方法はありますが、推奨しません。

ここでは唯一の方法は、サーバ・クラスに追加し、それがプレミアム変数

def is_premium 
    self.premium 
end 

を返す必要がありis_premiumある場合は、相続

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

それとも、あなたのケースでの使用に優れていますああ、あなたはRubyで "question"メソッドを使うべきです... Mongoidはブール値に対してこれらを提供しますが。

def premium? 
    self.premium 
end 
0

使用クラスの継承と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> 

default_scopeあなたはPremiumServerでクエリを実行するたびに使用され、手動で.premium_serversを呼び出す必要はありません。

これは別のやり方で、つまりモンゴイド的に「条件に基づく」ものです。

さらなる情報:

関連する問題