什么是在rails中连接表的最佳方法

时间:2015-04-10 14:17:20

标签: ruby-on-rails ruby ruby-on-rails-4 join

我想知道在这种特殊情况下连接表格的最佳方法是什么:
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更合适吗?

2 个答案:

答案 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