我正在尝试仅在满足条件时包含模块。
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 :(得分: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
。
这是以“以条件为基础”的另一种方式 - 以蒙古方式。
更多信息: