Ruby on rails 什么';这是rails中连接表的最佳方法

Ruby on rails 什么';这是rails中连接表的最佳方法,ruby-on-rails,ruby,ruby-on-rails-4,join,Ruby On Rails,Ruby,Ruby On Rails 4,Join,我想知道在这种特殊情况下,连接表的最佳方法是什么: 订单有一个拥有一个地址的所有者 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 } 地址=[] 总和=0.0 Orde

我想知道在这种特殊情况下,连接表的最佳方法是什么:
订单有一个拥有一个地址的所有者

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 } 
地址=[]
总和=0.0
Order.joins(所有者::地址)。
其中(订单:{created_at:1.day.ago},地址:{country:'US'})。

每个{o | sum+=o.payed;地址基于您的查询,我认为使用
includes
将是合适的。这将减少
o.owner.address
循环中的
o.owner.address
期间的数据库查询

使用
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 } 

Order.includes(owner::address)。其中(orders:{created_at:1.day.ago},address:{country:'US'})。每个{o| sum+=o.payed;address由于订单只能有一个所有者,所有者只能有一个地址,请使用联接。这样可以执行单个查询(速度更快)而不会增加返回的行数

如果您不确定订单是否有所有者,并且所有者是否有地址,那么请使用eager_load以便使用外部联接


更多信息:

总之-如果使用包含的模型的属性,使用
联接
更适合搜索,
包含
更适合搜索&是的,如果可能使用这些关联对象的信息,请使用包含。不过,您仍然会得到三个查询,其中joins()我应该给你一个。
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 }