Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何创建一个查询,使在一个表中按条件选择最后一条记录时有多个表_Ruby On Rails_Postgresql - Fatal编程技术网

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})'