Ruby on rails 如何创建一个查询,使在一个表中按条件选择最后一条记录时有多个表
我与很多人的关系都很融洽:Ruby on rails 如何创建一个查询,使在一个表中按条件选择最后一条记录时有多个表,ruby-on-rails,postgresql,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 h
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
但这将返回在任何时候都有状态ID的销售,而不是在最后一次如果元素的数量不太大,则可以在最后使用select
@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)}
否则,此帖子可能会帮助您:
-编辑-
我认为您可以首先获取所有上次SalesStatusHistory的id,这些id按sale_id分组,然后筛选它们的正确状态,然后从该列表中获取所有销售
根据那篇帖子,我认为它可能看起来像:
@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})'
您总是可以将最后两行合并到一个大请求中,但我看不出有什么好处
注意:可能需要进行一些更正,因为我无法从我所在的位置对其进行测试。非常感谢,但是元素的数量可能非常大,是否有一些方法可以优化此查询?感谢您的帮助,但是在@sales\u status\u id=salestatushistory中,DISTINCT不起作用。请选择DISTINCT ONsale\u id*.ordersale\u id,已在DESC.wherestatus\u sale\u id:@status.ids创建所有id正在返回
@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})'