2016-04-26 19 views
0

模型說我有兩個班使用grouped_collection_select到組由枚舉

class Recording 
    belongs_to :conversation 
end 

class Conversation < ActiveRecord::Base 
    has_many :recordings 

    enum status: [ :active, :archived ] 
end 

我想選擇存儲在「錄音」模式的談話。在這種情況下,如何使用grouped_collection_select將Conversation表中的所有記錄按兩個枚舉activearchived分組?

我可以找到關於grouped_collection_select的所有示例都是指在成員上調用方法以提供集合;與分組現有集合。

+0

所有的會話表中的記錄,記錄的不是對話? –

回答

2

grouped_collection_select方法不是您需要的最佳工具,因爲它確實處理主記錄的關聯記錄,而如果我理解正確,您只需將所有Conversation記錄添加到選擇標記,但是按其屬性,而不是關聯。

不過,您可以輕鬆地手動構建分組選項。我把這個代碼放到一個幫手不弄亂視圖模板太多:

# app/helpers/conversations_helper.rb 
module ConversationsHelper 

    def grouped_conversations_options_for_select(selected_conversation_id = nil) 
    options = {} 
    Conversation.statuses.keys.each do |status| 
     options[status] = Conversation.with_status(status).pluck(:name, :id) 
    end 
    grouped_options_for_select(options, selected_conversation_id) 
    end 

end 

# app/view/show.html.erb 
<%= select_tag :conversation_id, grouped_conversations_options_for_select(params[:conversation_id]) %> 

助手首先構造一個哈希結構如下:

{ 
    active: [[ conversation.id, conversation.name ], [...]], 
    archived: [[ conversation.id, conversation.name ], [...]], 
} 

此散列可以再傳給grouped_options_for_select將其轉換爲<OPTIONS>標籤,其中包括正確的<OPTGROUP>標籤。助手還支持在選擇選項中設置當前選定的值。其輸出然後傳遞給視圖模板中的選擇標記。

對於幫手的工作,還需要以下範圍添加到Conversation型號:

# app/models/conversation.rb 
scope :with_status, ->(status) { where(status: statuses[status]) } 
+0

甚至在你回答之前,這就是我最終做的。謝謝! – chrismanderson