2011-06-04 40 views
0

我想包括一個模塊,只有當條件得到滿足。Rails包含模塊上的條件

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 

這是行不通的,我不明白爲什麼。有人可以告訴我,我應該如何根據遇到的情況包含模塊,如上所述?

謝謝!

編輯:

我找到了答案,我的問題就在這裏:Mongoid and carrierwave

不過,我授予問題上的答案,因爲它可能是更有效的方法。

+0

是溢價實例方法或字段?如果是這樣,那麼這將不起作用,因爲包含在加載時發生在課堂級別。 – 2011-06-04 11:29:45

回答

4

包括髮生在班級上。您的高級屬性是實例級別。

有一些方法可以在每個實例級別執行include操作,但我不會推薦它們。

在這裏,您是使用繼承

更好
class Server; .. ; end 
class PremiumServer < Server; ..; end 

或者,在你的情況下,如果唯一方法是is_premium其添加到服務器類,並已將其退還保險費變量

def is_premium 
    self.premium 
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> 

將用於每次你做PremiumServer查詢時間default_scope,你不需要手動調用.premium_servers

這是以另一種方式「以條件爲基礎」 - 以mongoid的方式。

進一步的信息: