2014-07-25 108 views
0

我有一個方法,它從DELIVERYCOST數據庫中取出兩列,並將'title'列分組在'timing'下。它把它變成一個哈希將parent id傳遞給散列用於選擇的選項

def self.titles_by_timing 
    self.pluck(:id, :timing, :title).group_by(&:first).each { |_, v| v.map!(&:last) } 
    end 

DeliveryCost.titles_by_timing 
=> {"Install"=>["Luton Day (7am - 7pm)", "LWB Day (7am - 7pm)", "Luton Overtime (7pm - 7am)", "LWB Overtime", "Helper Day (7am - 7pm)", "Helper Overtime"], "Breakdown"=>["Luton Day (7am - 7pm)", "LWB Overtime", "Luton Overtime (7pm - 7am)", "Helper Day (7am - 7pm)", "Helper Overtime"], "Fuel"=>["Congestion Charge", "Fuel in London Zone 1-2", "Fuel in London Zone 3-4", "Fuel By Milege (Out of M25)]} 

這是從形式JOB交付部分COSTS

= f.select :delivery_cost_id, option_groups_from_collection_for_select(DeliveryCost.titles_by_timing, :timing, :title, :id) 

因爲JOB快遞費用屬於配送成本,運送成本有很多招聘快遞費用,我需要傳遞id以便在創建工作交付成本實例時創建關聯。不過,我這樣做很困難。我如何做到這一點,擴展我目前的方法嗎?

非常感謝幫助。

回答

0

看來DeliveryCost.titles_by_timing已經在做所有的舉重活動,所以你應該使用grouped_options_for_select而不是option_groups_from_collection_for_select

檢查ActionView::Helpers::FormOptionsHelper#grouped_options_for_select

UPDATE:

嘗試使用與grouped_options_for_select如下:

def self.titles_by_timing 
    self.all.each_with_object(Hash.new([])) do |delivery_cost, grouped| 
    grouped[delivery_cost.title] |= [[delivery_cost.id, delivery_cost.timing]] 
    end 
end 

注意,這種方法可能會由於加載所有對象到內存中表現不佳。如果這是一個問題,您可以嘗試一些緩存,記憶或將昂貴的查詢委託給數據庫。

+0

是的,但我不能通過ID?! – user3868832

+0

你說得對,我的不好。我已經用可能的解決方案更新了答案。讓我知道這有助於。 – wicz