2013-07-09 94 views
1

首先,讓我解釋什麼,我想做的事:Ruby on Rails的:扁平化ARRY哈希值與組由關鍵

我有這些模型:

"Question" 
name:string 
belongs_to :Category 

"Category" 
name:string 
has_many :Questions 

AgendaItem 
title:string 
body:string 
belongs_to :Category 

"Meeting" 
has_many :Questions 
has_many :AgendaItems 

的過程是這樣的: 用戶創建一個會議&從許多不同的類別(〜12個類別,每個具有10-20個問題)向它增加許多問題。

我有點工作,所以我有一個關於它的許多問題的會議。

現在,當用戶在一個名爲「Finalize」的會議上執行特定操作時,我想爲每個不同的類別創建一個AgendaItem(使用會議的問題),AgendaItem的:title應該是:分類和:它的身體應該是所有已根據該類別中選擇的問題

eg: <ul><li>Question1</li><li>Question2</li>...</ul> 

我可以在一個討厭的大循環做到這一點(和檢查的問題在當前類目我是否是現在不同於前一個&創建一個新的AgendaItem),或使用兩個循環(一個創建不同的AgendaItems,然後一個將問題彈入:body)

但我敢肯定有更好的方法做到這一點,使用陣列&注入。

我當前的代碼創建哈希像這樣的數組(我認爲):

[{:id=>1, :question=>"Question1"}, {:id=>1, :question=>"Question3"},{:id=>3, :question=>Question10}] 

這是做的代碼:

@meeting = Meeting.find <the_id> 
array = @meeting.questions.all.map { |q| { id: q.category.id, question: q.name } } 

其中:id爲:的id分類和:問題是:

:問題的

我想,我想這個落得名

然後我可以循環它&從id(key)創建一個AgendaItem,並將它的主體設置爲:question(value)。

回答

0

試試這個:

questions.all.group_by(&:category_id).map { |q| 
    {:id => q.first, :question => q.second.each.map { |qn| qn.name }} 
} 
#output: 
#[{:id=>1, :question=>['Question1', 'Question3']},{:id=>3, :question=>['Question10']}] 
+0

謝謝,這很好地工作。所以它將不同的值(:name)放入一個數組中,該數組是散列數組中的鍵(:category_id)的值,對吧? – user2563682

+0

我可以問(因爲我對ruby有點新鮮)q.first和q.second究竟是什麼意思?他們不是指第一個和第二個問題嗎?在我的例子中,只有3個問題在一個類別中有2個,但在一個類別中最多可能有20個問題 – user2563682

+0

'q.first'表示數組的第一個元素,如'q [0]','q.second'是'q [1]'。 'category_id'與'category.id'相同 –