展平has_many关联并获取属性总和

时间:2014-06-28 15:49:22

标签: ruby-on-rails ruby-on-rails-4 has-many

我想了解最有效的方法来展平一些has_many关联,然后获得子关联的某些属性的总和。假设您有以下数据结构:

class Restaurant < ActiveRecord::Base
    has_one :address
    has_many :menu_items
end

class Address < ActiveRecord::Base
    belongs_to :restaurant
end

class MenuItem < ActiveRecord::Base
    belongs_to  :restaurant
end

假设MenuItem具有属性&#34; cost&#34;,并且Address具有属性&#34; zip_code&#34;。我想做的是找到邮政编码中的所有餐馆&#39; 10101&#39;并获得其菜单项的成本属性的总和。说我希望能够显示餐馆的平均成本&#39;一个地区的产品。

我认为有很多蛮力的方法可以做到这一点,但我知道应该有更好的方法。例如,在C#/ LINQ中,如果我有一组类似的数据结构,那么写起来很容易:

var sum=restaurants.Where(r => r.zip_code==10101).SelectMany(r => r.MenuItems).Sum(mi => mi.Cost);

我想出的最好的,但对我来说感觉不对,是:

def thing_I_dont_know_how_to_do
    find_zip=Address.where(:zip_code => zip_code)
    restaurants=Restaurant.joins(:address, :menu_items).merge(find_zip)
    restaurant_ids=restaurants.map(&:id)

    sum=MenuItems.sum(:cost, :conditions => {:restaurant_ids => venue_ids})
end

任何人都可以帮我改进吗?

1 个答案:

答案 0 :(得分:2)

您可以使用单个SQL请求来执行此操作,该请求选择邮政编码10101中餐馆的所有菜单项,并汇总所有费用:

MenuItem.joins(restaurant: :address).where(addresses: { zip_code: '10101' }).sum('cost')