左外部联接Rails,条件是左表不包括所有右表记录

时间:2019-02-04 08:40:58

标签: ruby-on-rails ruby postgresql join activerecord

我正在使用Rails 5和Postgresql。我的模型如下: 变体has_many line_items 订单项属于订单 订购has_many LineItems

我需要做的是将外部表与line_items和order一起加入variants表,以便计算订单总和和按variant分组的总金额。我需要保留在特定日期范围内完成的订单的联接变量,但是在订单表(联接的右侧)上添加此条件会导致从变量左侧排除许多记录。以下是我的原始查询

Spree::Variant.left_outer_joins(line_items: :order)
                  .where(spree_orders: { completed_at: params[:start_date]..params[:end_date] })
                  .select('spree_variants.*, SUM(spree_line_items.quantity) as sales_count, SUM(spree_line_items.quantity * spree_line_items.price) as sales_amount')
                  .group('spree_variants.root_variant_id, spree_variants.id')

我现在想要做的是在联接中包括日期之间的条件,但是总是出现错误,这是我正在尝试做的并且找不到错误。

Spree::Variant.joins("LEFT OUTER JOIN spree_line_items ON spree_line_items.variant_id = spree_variants.id LEFT OUTER JOIN spree_orders ON spree_orders.id = spree_line_items.order_id AND spree_orders.completed_at BETWEEN #{params[:start_date]} AND #{params[:end_date]}")
                  .select('spree_variants.*, SUM(spree_line_items.quantity) as sales_count, SUM(spree_line_items.quantity * spree_line_items.price) as sales_amount')
                  .group('spree_variants.root_variant_id, spree_variants.id')

start_date和end_date的参数如下:

params[:end_date] = Time.current.end_of_day
params[:start_date] = (Time.current - 200.days).beginning_of_day

即参数[:结束日期]

  

2019年2月4日星期一23:59:59 EET +02:00

我第二个查询产生的SQL是重复的,它产生2个确切的sql查询 任何人都有更好的解决方案或如何解决此问题的想法?

0 个答案:

没有答案