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 }