我有一个“有很多通过”的关系:
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的销售,而不是最后一次
答案 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})'
你总是可以在一个大请求中合并最后两行,但我认为没有优势。
注意:可能需要进行一些更正,因为我无法从我所在位置进行测试。