【发布时间】:2012-12-04 21:55:09
【问题描述】:
我正在尝试使用像这样的常规类方法来访问哈希:
aHash.key
但我收到此错误:
{:key1=>"value1", :key2=>"value2"}:Hash 的未定义方法 `key1'
我按照here 的建议在 Hash 类中定义了一个“method_missing”:
class Hash
def method_missing(method, *params)
method = method.to_sym
return self[method] if self.keys.collect(&:to_sym).include?(method)
super
end
end
我肯定知道,当我调用“aHash.key”时,它不会使用我定义的哈希。如果我查看我的宝石上的一个,它会显示:
需要“activerecord-postgres-hstore/hash”
所以我检查了这个文件,确实他们已经实现了另一个哈希。我相信我应该在其中添加“method_missing”,但可以在不修改 gem 的情况下完成吗?
也许我不明白类重载如何与 ruby 一起工作,所以答案可能是别的。
【问题讨论】:
-
你为什么不直接做
hash[:key1]? -
发现了我的问题,我在我的模型上添加了 'require "hash"' 并完成了。
-
与其对 Hash 类进行猴子修补(危险!),不如考虑使用开放结构。 ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html
-
@SporkInventor 我知道猴子补丁不是很整洁,但我正在将 HSTORE 用于非 SQL 对象,目前我没有太多选择。我不希望我的程序员一直抱怨非 SQL 哈希“复杂”。如果创建了一个使用 OpenStruct 而不是哈希的 gem,我会加入。
标签: ruby-on-rails