2011-06-04 3 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 

Это не работает, и я не могу понять, почему. Может кто-нибудь, пожалуйста, скажите мне, как я должен включать модули на основе состояния, которое выполняется, как указано выше?

Спасибо!

EDIT:

Я нашел ответ на мою проблему здесь: Mongoid and carrierwave

Однако я присуждении вопрос к началу ответа, как это, вероятно, более полезным способом.

+0

является премиум метод экземпляра или поля? если это так, то это не сработает, потому что включение происходит на уровне класса при его загрузке. –

ответ

4

включает в себя события на уровне класса. Ваш премиальный атрибут находится на уровне экземпляра.

Есть способы сделать включение на уровне экземпляра, но я бы не рекомендовал их.

Здесь лучше использовать наследование

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

Или, в вашем случае, если единственный способ is_premium добавить его к классу сервера и его возврата премии переменная

def is_premium 
    self.premium 
end 

oh, и вы должны использовать метод «вопрос» в ruby ​​... Хотя 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 вручную.

Это «условно-основанный» по-другому - в моргидном виде.

Дополнительная информация:

Смежные вопросы