Rails包含条件模块

时间:2011-06-04 10:58:11

标签: ruby module mongoid

我正在尝试仅在满足条件时包含模块。

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

但是,我将问题提交给最佳答案,因为它可能是更有用的方式。

2 个答案:

答案 0 :(得分:4)

包括在班级上发生。您的高级属性是实例级别。

有多种方法可以在每个实例级别上执行包含,但我不建议使用它们。

这里你最好使用继承

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

或者,在您的情况下,如果唯一的方法是is_premium将其添加到Server类并让它返回高级变量

def is_premium
  self.premium
end

哦,你应该在ruby中使用“question”方法......虽然Mongoid为布尔值提供了这些。

def premium?
  self.premium
end

答案 1 :(得分: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

这是以“以条件为基础”的另一种方式 - 以蒙古方式。

更多信息: