如何创建一个查询,按多个表中的条件选择最后一条记录

时间:2017-06-28 15:37:28

标签: ruby-on-rails postgresql

我有一个“有很多通过”的关系:

class Sale < ApplicationRecord
    has_many :sales_status_histories
    has_many :users, through: :sales_status_histories
    has_many :status_sales, through: :sales_status_histories
end

class StatusSale < ApplicationRecord
    has_many :sales_status_histories
    has_many :users, through: :sales_status_histories
    has_many :sales, through: :sales_status_histories
end

class User < ApplicationRecord
    has_many :sales_status_histories
    has_many :sales, through: :sales_status_histories
    has_many :status_sales, through: :sales_status_histories
end

class SalesStatusHistory < ApplicationRecord
    belongs_to :sale
    belongs_to :status_sale
    belongs_to :user
end

我想选择在同一查询中具有最后特定状态的所有销售

我需要使用此信息填充面板

我这样做:

@status = StatusSale.where(id: [2,9,10])
@date = DateTime.current.beginning_of_month..DateTime.current.end_of_month

@sales_col_2 = Sale.distinct.joins(:sales_status_histories).where(sales_status_histories: {created_at: @date}).where(sales_status_histories: { status_sale_id: @status })

但是这会在任何时刻返回具有状态ID的销售,而不是最后一次

1 个答案:

答案 0 :(得分:1)

您可以使用&#34;选择&#34;最后,如果元素的数量不是太大。

@status = StatusSale.where(id: [2,9,10])
@date = DateTime.current.beginning_of_month.DateTime.current.end_of_month

@sales_col_2 = Sale.distinct.joins(:sales_status_histories).where(sales_status_histories: {created_at: @date}).where(sales_status_histories: { status_sale_id: @status }).select {|s| @status.include?(s.sales_status_histories.last.status_sale_id)}

否则,这篇文章可能会对您有所帮助:Rails query through association limited to most recent record?

- 编辑 -

我认为你首先要获得所有最后一个SalesStatusHistory的ids,这些ids由sale_id分组,然后过滤它们必须具有正确状态,并从该列表中获取所有销售。

基于该帖子:How to get the latest record from each group in ActiveRecord?,我认为它看起来像:

@status = StatusSale.where(id: [2,9,10])
@date = DateTime.current.beginning_of_month.DateTime.current.end_of_month

@sales_status_ids = SalesStatusHistory.select("DISTINCT ON(sale_id) *").order("sale_id, created_at DESC").where(status_sale_id: @status).ids
@sales_col_2 = Sale.distinct.joins(:sales_status_histories).where(sales_status_histories: {id: @sales_status_ids})'

你总是可以在一个大请求中合并最后两行,但我认为没有优势。

注意:可能需要进行一些更正,因为我无法从我所在位置进行测试。