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对我总是假的,我做错了什么?有没有更好的方法来做到这一点?

4

2 回答 2

1

在 Ruby 中,哈希键通过相等来工作。只要您使用的密钥与存储的密钥相同,您就可以在哈希中存储和检索值。

例如:

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

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

大多数对象并非如此:

class Example; end

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

因此,您用来存储在散列中的键必须是eql?您用来检索的键。eql?等价于==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
于 2013-04-09T08:43:00.960 回答
0

我认为你应该这样分配它

session[:important_data][:hash_key] = hash_key

并访问它

session[:important_data][:hash_key]
于 2013-04-09T08:36:22.253 回答