我有一个方法,它从DELIVERYCOST数据库中获取两列,并将列'title'分组到grouping 'timing'下。它会将其转换为散列
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)]}这是表单中作业交付成本的部分
= f.select :delivery_cost_id, option_groups_from_collection_for_select(DeliveryCost.titles_by_timing, :timing, :title, :id) 由于作业交付成本属于交付成本,且交付成本有多个作业交付成本,因此在创建作业交付成本实例时,需要传入id才能创建关联。然而,我在这样做时遇到了很大的困难。我如何做到这一点,我要扩展我当前的方法吗?
非常感谢您的帮助。
发布于 2014-07-25 18:33:25
看起来DeliveryCost.titles_by_timing已经在做所有的繁重工作了,所以你应该使用grouped_options_for_select而不是option_groups_from_collection_for_select。
检查ActionView::Helpers::FormOptionsHelper#grouped_options_for_select。
更新:
尝试在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请注意,由于将所有对象加载到内存中,此方法的性能可能会很差。如果这是一个问题,您可以尝试一些缓存、记忆或将昂贵的查询委托给数据库。
https://stackoverflow.com/questions/24952749
复制相似问题