2014-07-25 43 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