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ステートメントを作成する以外にこれを行う良い方法はありますか(つまり、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 に答える