我的应用程序中的许多地方都使用了一种方法,包括某些控制器和其他模型。
class MyClass
LONG_CONSTANT_1 = "function(x) { some_long_js_function }"
LONG_CONSTANT_2 = "function(x) { another_really_long_js_function }"
def self.my_group_method(my_constant)
count = MyClass.collection.group(
:keyf => my_constant,
:reduce => "function(x, y) {y.count += x.count;}"
)
end
end
所以即使在my_group_method
内部调用的方法与MongoDB相关,问题本身也没有关系,基本上我希望能够调用
MyClass.my_group_method(LONG_CONSTANT_2)
或
MyClass.my_group_method(LONG_CONSTANT_1)
(实际上还需要几个常量,但示例只有2个)
不幸的是,我的实施会导致错误:NameError: wrong constant name LONG_CONSTANT_1
有关如何最好地实现此行为的任何想法?我可能会有几个长常量(实际上JS函数作为发送到MongoDB的字符串),我在这里使用的设计模式出错了什么?
非常感谢任何帮助!
答案 0 :(得分:1)
听起来你的常量存在范围问题。您希望将类方法称为:
MyClass.my_group_method(MyClass::LONG_CONSTANT_1)
MyClass.my_group_method(MyClass::LONG_CONSTANT_2)
我可以得到这个NameError:
uninitialized constant Object::LONG_CONSTANT_1 (NameError)
来自与您的代码结构相似的内容,但不是“错误的常量名称”错误。
如果常量的所有命名空间太多,那么你可以记录预期的输入(可能是符号)然后在你的类中:
INPUTS = (
:long_symbol_1 => LONG_CONSTANT_1,
:long_symbol_2 => LONG_CONSTANT_2
)
# Frobnicate the pancakes.
#
# The `which` argument should be `:long_symbol_1` or `:long_symbol_2`.
# etc.
def self.my_group_method(which)
str = INPUTS[which]
raise ArgumentError => "No idea what you're talking about" if(!str)
#... continue on
end
这种方法会给你一些参数安全性,你的常量,并避免在调用者中使用MyClass::
作为参数前缀的噪音。