web-dev-qa-db-ja.com

rubyのobject_id属性でオブジェクトを見つけることはできますか?

新しいオブジェクトを作成するとき、

o = Object.new

このオブジェクトにはIDがあります。

o.object_id 
#=> ########

Objectクラスを使用して、他のいくつかのオブジェクトも作成します。 object_id属性を使用してRubyオブジェクト 'o'を見つけるための最良の方法は何でしょうか?私は次のような観点から考えています。

search_id = o.object_id
search_result = Object.find(search_id)

ここで、「search_results」は「search_id」に対応するオブジェクトになります。また、オブジェクトにインデックスを付け、GUIDなどでオブジェクトを取得するためのまったく異なるアプローチをぜひお勧めします。本当にありがとう!

ええと、私は本当にデータベースのコンテキストでこれについて考え、MySQLクエリまたはオブジェクトを見つけるために選択したDBのクエリを使用する必要があると思います。考えれば考えるほど、この架空の「find()」メソッドからアクセスできるのは、新しく作成されたものまたは「アクティブ」なものだけでしょうか。これをくだらない質問にしてすみません。

29
wuliwong

はい、できます:

irb(main):002:0> s1 = "foo"
#=> "foo"
irb(main):003:0> s2 = ObjectSpace._id2ref(s1.object_id)
#=> "foo"
irb(main):004:0> s2.object_id == s1.object_id
#=> true
irb(main):005:0> s2[0] = "z"
#=> "z"
irb(main):006:0> s1
#=> "Zoo"

あなたはこれをすべきですか?それはあなたにお任せします。シリアル化可能なidを使用してオブジェクトを格納するためのオタクな方法はあまりありません(たとえば、配列に格納してインデックスを返す)。遭遇する可能性のある問題の1つは、オブジェクトに対して保持する唯一の「参照」がobject_idである場合、探していないときにオブジェクトをGCによって収集できることです。

61
Phrogz