Order
有多个孩子Items
。 Items
有许多孩子Charges
。在def display
类型的Controller方法及其关联视图中,我希望显示:1)order
及其子items
的所有属性和2){{的总和来自amount
的1}}属性,用户友好的组合。如,
Charges
因为我以后需要所有<%= @order.id %>
<%= @order.name %>
<% @order.items.each do |item| %>
<%= item.id %>
<%= item.name %>
<% end %>
@total_item_charges
# below 2 should sum into @total_item_charges above
@total_item_type_a_charges
@total_item_type_b_charges
属性,我想我知道要急切加载,但鉴于我只需要items
的1个属性(和1来查询),我是否应该加载那呢?
接近A
使用charges
急切加载孩子includes
以及孙子items
,以便所有信息都加载一次并根据需要使用
charges
方法B
仍然急切地加载孩子# CONTROLLER
@order = Order.includes(items: [:charges]).where(id: params[:order_id]).first
# items/charges already loaded into memory
@order.items.each do |i|
i.charges.each do |c|
if c.type == "type_a"
@total_item_type_a_charges += c.amount
else
@total_item_type_b_charges += c.amount
end
end
end
@total_item_charges = @total_item_type_a_charges + @total_item_type_b_charges
,而不是孙子items
,而是在需要时进行charges
次查询
where
在你的回答中......
# CONTROLLER
@order = Order.includes(:items).includes(:shipments).where(id: params[:order_id]).first
@order.items.each do |i|
@total_item_type_a_charges += i.charges.where(type:"type_a").pluck(:amount).inject(:+)
@total_item_type_b_charges += i.charges.where(type:"type_b").pluck(:amount).inject(:+)
end
@total_item_charges = @total_item_type_a_charges + @total_item_type_b_charges
完全错误,那就完全标记(gulp,希望不是这样)答案 0 :(得分:0)
你必须考虑一个真实世界的情况,并且理想情况下,做一些性能测试。如果我要实现这一点,我会向total_charge
添加Item
字段,并在添加,更新或删除费用时保持更新,类似于belongs_to ... counter_cache: true
。
替代方案可能如下所示:
class Order < ActiveRecord::Base
has_many :items # as before
has_many :items_with_charge, :class_name: 'Item',
-> { joins(:charges).group('items.id').select('items.*, sum(charges.amount) as total_amount)') }
...
end
现在,如果您执行以下操作:
order = Order.includes(:items_with_charge)
每个项目都应包含使用item['total_amount']