1

所以我有一个与多个模型相关的连接表,并存储适当的 id 和类,如下所示:

Statistics
-----------------------------------
|object_type | object_id | value  |
-----------------------------------
| "User"     |     1     |  100   |
-----------------------------------
| "Post"     |     61    |  50    |
-----------------------------------

我希望使用元编程来传递“object_type”并以某种方式使用生成的对象,如下所示:

send("User").find(1)        #i.e. User.find(1)
send("Post").find(61)       #     Post.find(61)

除了构造复杂的 if-else 或 case 语句(即 if object_type == "User"...)之外,有什么好的方法吗?

4

3 回答 3

3

类以常量命名,因此您可以使用const_get轻松地将字符串转换为类:

self.class.const_get("User").find(1)

或者

Object.const_get("User").find(1)

但通常最好使用第一个版本,因为它更接近于您直接引用该类时所获得的内容。

于 2012-05-08T17:21:53.553 回答
3

由于您在 Rails 中,ActiveSupport 通过http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize为您提供 String#constantize 。这可能是处理它的最“狡猾”的方式。它只是在幕后使用 const_get,但它也有一些逻辑来帮助避免错误。

于 2012-05-08T17:26:30.880 回答
0

我不确定它是否真的是一个好的解决方案,但 eval 只是有效。也许有一些理由不这样做,不知道

eval("User").find(1)
于 2012-05-08T17:53:09.870 回答