我有一个基于缺少方法调用执行特殊指令的类
class MyClass
def method_missing(mname, *args)
p mname
nil
end
end
执行以下操作....
obj = MyClass.new
obj.method1
将打印出:method1
但是,如果我这样做......
obj.method1.method2
我无法以可以打印method_missing
的方式定义:method2
(注意:我必须在我的method_missing方法中返回nil)
有什么想法吗?
更新
好吧,我实际上要做的事情有点奇怪,而且我不确定这是否可能,但我的尝试是为了解释它。
我有一个类似的课程:
class MyClass
def method_missing(mname, *args)
return some_var[mname]
end
end
如果mc
是MyClass
的实例,我希望能够调用mc.method
并获取特定对象。
现在,我还希望能够调用mc.method.some_other_method
,其中some_other_method
是mc.method
这是一个棘手的部分:调用mc.method.some_other_method
时,MyClass按照它的方式编写,满足我的需要(即我返回对象,并调用some_other_method
)。但是,如果只调用mc.method
,我需要这样的东西......
class MyClass
def method_missing(mname, *args)
#if ONLY mc.method
some_var[mname].sanitize
return some_var[mname]
end
end
我知道解决这个问题的方法就是使用MyClass的第二个版本,它应该适用于两种情况(mc.method
和mc.method.some_other_method
)但事实是,我只需要调用{ {1}}在调用sanitize
时,而不是在调用mc.method
时调用{1}}。 sanitize是一种资源密集型方法(我只想在必要时调用它)。
尽管如此,除了每次只调用mc.method.some_other_method
之外,还有其他解决方案吗?
答案 0 :(得分:0)
更新后,您尝试做的事情开始看起来像ActiveRecord过滤器链。如果没有任何其他链调用(method2),它被设计为仅查询DB(在您的情况下调用sanitize)。突然之间,红宝石无法知道是否会有一个通话,当方法返回时,你永远不知道结果会发生什么。
ActiveRecord用来解决问题的技巧是返回中间链对象,只有在调用each
,to_a
,map
等方法时才会触发数据库加载。也就是说,仅当用户请求查询结果时。
考虑到这一点,你可以想象对象旁边会发生什么。也许有这样的触发方法?至少,您可以随时添加它们
obj.method1.load!
obj.method1.method2.load!