我想知道在这种特殊情况下连接表格的最佳方法是什么:
Order has one Owner which has one Address
addresses = []
sum = 0.0
Order.joins(owner: :adress).
where(orders: {created_at: 1.day.ago} , address: {country: 'US'} ).
each {|o| sum += o.payed;addresses << o.owner.address.to_s }
在这种特殊情况下使用includes()
或joins
更合适吗?
答案 0 :(得分:1)
根据您的查询,我认为使用includes
是合适的。这将减少o.owner.address
循环内each
期间的数据库查询。
使用includes
将在内存中加载关联的模型对象,这样您就不必进行进一步的数据库查询来获取每个所有者地址。
我建议使用includes
:
Order.includes(owner: :adress).where(orders: {created_at: 1.day.ago} , address: {country: 'US'} ).each {|o| sum += o.payed;addresses << o.owner.address.to_s }
如果您想在所包含的模型上应用条件,则必须添加references,如下所示:
Order.includes(owner: :adress).where(orders: {created_at: 1.day.ago} , address: {country: 'US'} ).references(:owners, :adresses).each {|o| sum += o.payed;addresses << o.owner.address.to_s }
答案 1 :(得分:1)
由于订单只能拥有一个所有者,并且所有者只能拥有一个地址,因此请使用连接。这允许执行单个查询(这将更快),而不会增加返回的行数。
如果您确定订单是否拥有所有者,并且所有者将拥有地址,请使用eager_load以便使用外部联接。
更多信息:http://blog.bigbinary.com/2013/07/01/preload-vs-eager-load-vs-joins-vs-includes.html