Rails 3.2如何将model.inspect转换为哈希?

时间:2014-04-23 05:08:20

标签: ruby-on-rails ruby string

我正在使用inspect方法捕获有关某些模型记录的“时间点”(审核)数据,以将记录状态转储到string。例如,我在变量User中存储a_user记录后,我调用inspect并将结果存储在字符串变量archived_user_data中:

1.9.3p484 :045 > archived_user_data = a_user.inspect
 => "#<User id: 17, email: \"ray.johnson@breakfs.com\", encrypted_password: \"$2a$10$v3CJZftIyDW/XZpktXXdMOuN1IxMoVmaofcIqEB6kBV....\", created_at: \"2014-04-05 21:42:09\", updated_at: \"2014-04-05 21:43:25\", account_id: 9>" 

1.9.3p484 :046 > archived_user_data
 => "#<User id: 17, email: \"ray.johnson@breakfs.com\", encrypted_password: \"$2a$10$v3CJZftIyDW/XZpktXXdMOuN1IxMoVmaofcIqEB6kBV....\", created_at: \"2014-04-05 21:42:09\", updated_at: \"2014-04-05 21:43:25\", account_id: 9>" 

将来某个时候检索archived_user_data时,我需要将其转换为哈希值。有一个简单的方法吗?看起来像转换为字符串的哈希通常会使用eval转换回来,但在这种情况下,eval(archived_user_data)会返回nil

3 个答案:

答案 0 :(得分:1)

如果你仍然可以自由使用元帅,那很好!如果没有,我建议你使用

将字符串剥离到哈希部分
s = archived_user_data.match(/#<User (.*)>/)[1]

之后您可以使用eval重建哈希

eval("{" + s + "}")

答案 1 :(得分:0)

使用attributes执行以下操作:

  

返回所有 属性哈希,其名称为 keys values < / em>属性为值。

archived_user_data = a_user.attributes

答案 2 :(得分:0)

您可以使用Marshal转储和存储任何Ruby对象。

示例:

(使用@ Arup的代码参考)

data_hash = a_user.attributes
dump_string = Marshal.dump(data_hash)
retrieved_hash = Marshal.load(dump_string)

您可以将dump_string存储在文件或数据库或任何其他存储区域中。

修改

具体案例:

2.1.0 :013 > {:a => "b"}.inspect
 => "{:a=>\"b\"}"
2.1.0 :014 > "{id: 17, email: \"ray.johnson@breakfs.com\", encrypted_password: \"$2a$10$v3CJZftIyDW/XZpktXXdMOuN1IxMoVmaofcIqEB6kBV....\", created_at: \"2014-04-05 21:42:09\", updated_at: \"2014-04-05 21:43:25\", account_id: 9}"
 => "{id: 17, email: \"ray.johnson@breakfs.com\", encrypted_password: \"$2a$10$v3CJZftIyDW/XZpktXXdMOuN1IxMoVmaofcIqEB6kBV....\", created_at: \"2014-04-05 21:42:09\", updated_at: \"2014-04-05 21:43:25\", account_id: 9}"
2.1.0 :015 > eval("{id: 17, email: \"ray.johnson@breakfs.com\", encrypted_password: \"$2a$10$v3CJZftIyDW/XZpktXXdMOuN1IxMoVmaofcIqEB6kBV....\", created_at: \"2014-04-05 21:42:09\", updated_at: \"2014-04-05 21:43:25\", account_id: 9}")
 => {:id=>17, :email=>"ray.johnson@breakfs.com", :encrypted_password=>"$2a$10$v3CJZftIyDW/XZpktXXdMOuN1IxMoVmaofcIqEB6kBV....", :created_at=>"2014-04-05 21:42:09", :updated_at=>"2014-04-05 21:43:25", :account_id=>9}

您需要了解检查时存在的哈希值,并将其存储为以下形式的字符串:

"#<User id: 17, email: \"ray.johnson@breakfs.com\", encrypted_password: \"$2a$10$v3CJZftIyDW/XZpktXXdMOuN1IxMoVmaofcIqEB6kBV....\", created_at: \"2014-04-05 21:42:09\", updated_at: \"2014-04-05 21:43:25\", account_id: 9>"

但应该采用以下形式:

"{id: 17, email: \"ray.johnson@breakfs.com\", encrypted_password: \"$2a$10$v3CJZftIyDW/XZpktXXdMOuN1IxMoVmaofcIqEB6kBV....\", created_at: \"2014-04-05 21:42:09\", updated_at: \"2014-04-05 21:43:25\", account_id: 9}"

如果将字符串修改为上述格式,则可以评估并获取哈希值。请参阅上面的三行示例。