2013-12-16 39 views
0

所以我有這個散列:充分利用哈希信息在紅寶石

[#<Post id: 4, content: "This is a new post", user_id: 12, created_at: "2013-12-16 16:52:33", updated_at: "2013-12-16 16:52:33">] 

據我瞭解的哈希是一個數組,所以我可以在我的數組許多哈希被命名爲@posts

現在我想將哈希信息打印到頁面上。例如,它可以顯示創建時間,然後顯示帖子的內容。

問題是我真的不明白紅寶石的for i in array語法。我知道我需要做一個for循環來獲取每個散列,然後從另一個循環獲取我想要的任何信息,但ruby語法對於我來說就是這樣一個話題。

回答

1
#<Post id: 4, content: "This is a new post", user_id: 12, created_at: "2013-12-16 16:52:33", updated_at: "2013-12-16 16:52:33"> 

不是Hash,這是一個ActiveRecord對象。

您可以通過使用符號訪問一個ActiveRecord模型屬性:

instance.attribute 

在你的情況下,假設post是變量持有對象:

post.created_at 

它看起來像對象存儲到一個數組中。所以請確保首先從數組中提取項目。

你可以查看所有的模型屬性通過詢問實例返回屬性的Hash和遍歷他們:

post.attributes.each do |key, value| 
    puts "#{key}: #{value}" 
end 

您可以識別它是一個對象,而不是一個散列,因爲符號的對應哈希是:

=> {:id=>4, :content=>"This is a new post", :user_id=>12, :created_at=>"2013-12-16 16:52:33", :updated_at=>"2013-12-16 16:52:33"} 
+0

但是hash和ActiveRecord模型有什麼區別?爲什麼我應該使用第二個,我的意思是第一個? – Veske

+1

如果您使用ActiveRecord並使用ActiveRecord查詢數據庫,您將獲得ActiveRecord模型對象,而不是哈希。我不知道爲什麼你認爲在Ruby中每個對象都是一個哈希。事實上,情況正好相反。 –

1

for循環很少使用在Ruby中。我認爲使用它並不壞,但each方法確實降低了副作用的可能性。

For vs Each in Ruby」解釋得很好。

1

我認爲在Ruby loops上閱讀會有好處!

至於解決你的問題而言,你可以在陣列中的每個元素使用Array類的each方法循環:

@posts.each do |post| 
    puts post.content 
end 

上面的代碼遍歷每個元素@posts數組(在本例中爲Post),然後在當前循環索引處打印post對象的content屬性的值。

+0

@downvoter,簡要理由downvote將是有益的,有可能的答案可能用你的建議做得更好。 – vee

0

你有陣內的不是一個哈希,這是一個Post對象:

post_array = [#<Post id: 4, content: "This is a new post", user_id: 12, created_at: "2013-12-16 16:52:33", updated_at: "2013-12-16 16:52:33">] 

post_array.each do |post| 
    p post.id 
    p post.content 
    #etc 
end 
1

嚴格地說:

  1. 這不是亂碼,這是一個Post對象。
  2. 哈希是不是數組。

爲了得到屬性值對的post對象,使用方法attributes

post = Post.first 
post.attributes.each do |attr, value| 
    puts "#{attr}: #{value}" 
end