2013-04-09 61 views
1

我存储在哈希的对象,它是在会话对象是这样的:存储和检索对话对象

hash_key = ImportantData.new 
    hash_key.test_id = params[:test_id] 
    hash_key.user_id = params[:user_id] 

    session[:important_data] ||= {} 
    session[:important_data][hash_key] = nil 

然后我在其他控制器打印此地图session[:important_data][hash_key],并尝试检查对象是否是在那里或不是这样的:

hash_key = ImportantData.new 
hash_key.schedule_id = @test.id 
hash_key.user_id = @user.id 

in_hash = session[:important_data].has_key?(hash_key) unless session[:important_data].nil? 

in_hash总是对我错,我做错了什么?有没有更好的方法来做到这一点?

+0

也许这应该是'会话[:important_data]的''而不是会话[:重要]'? – Zippie 2013-04-09 08:26:44

+0

我错过了什么吗?你在两个例子中使用了两个不同类的对象作为键。如果要检索该会话密钥中的数据,则需要使用相同的对象(即'object1.object_id == object2.object_id') – 2013-04-09 08:33:51

+0

我已更新问题 – 2013-04-09 08:38:10

回答

1

在Ruby中,哈希键work by equality。只要您使用的密钥等于存储的密钥,就可以在哈希中存储和检索值。

例如:

hsh = { 'hello' => 'world' } 
p hsh['hello']  #=> "world" 
'hello'.eql? 'hello' #=> true 

您可以检索值,因为相同的字符串值始终在Ruby中eql?

这不是大多数对象的情况:

class Example; end 

object1 = Example.new 
object2 = Example.new 
object1.eql? object2 #=> false 

因此,您使用的哈希存储密钥必须eql?给您使用来获取一个。 eql?相当于== and equal?

您正在创建ImportantData的两个实例,它们不会相互等同。它看起来像你可以完成你想要用一个哈希键:

hash_value = ImportantData.new 
hash_value.test_id = params[:test_id] 
hash_value.user_id = params[:user_id] 

session[:important_data] ||= hash_value 
puts session[:important_data].class.name #=> ImportantData 
session[:important_data].test_id   #=> puts out value of test_id 
0

我想你应该赋予它这样的

session[:important_data][:hash_key] = hash_key 

和访问它

session[:important_data][:hash_key]