簡體   English   中英

Rails 3.2如何將model.inspect轉換為哈希?

[英]Rails 3.2 How do I convert model.inspect into a hash?

我正在使用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

如果您仍然可以自由使用元帥,那就好! 如果沒有,我建議您使用以下方式將字符串剝離到哈希部分

s = archived_user_data.match(/#<User (.*)>/)[1]

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

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

只需使用attributes執行以下操作:

返回與他們的名字作為和屬性作為值的 屬性哈希值

archived_user_data = a_user.attributes

您可以使用元帥來轉儲和存儲任何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}"

如果將字符串修改為上述格式,則可以評估並獲取哈希值。 請參閱上面的三行示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM