我想了解最有效的方法来展平一些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
任何人都可以帮我改进吗?
答案 0 :(得分:2)
您可以使用单个SQL请求来执行此操作,该请求选择邮政编码10101中餐馆的所有菜单项,并汇总所有费用:
MenuItem.joins(restaurant: :address).where(addresses: { zip_code: '10101' }).sum('cost')