Rails включает модуль при условии - PullRequest
1 голос
/ 04 июня 2011

Я пытаюсь включить модуль только при выполнении условия.

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 и carrierwave

Тем не менее, я присваиваю этот вопрос верхнему ответу, так как это, вероятно, более полезный способ.

Ответы [ 2 ]

5 голосов
/ 04 июня 2011

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

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

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

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

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

def is_premium
  self.premium
end

о, и вы должны использовать метод "question" в ruby ​​... Хотя Mongoid предоставляет их для логических значений.

def premium?
  self.premium
end
0 голосов
/ 04 июня 2011

Использовать наследование классов и механизм видимости 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 вручную.

То есть «условно» по-другому - монгоидным образом.

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

...