最新价格和 will_paginate
Posted
技术标签:
【中文标题】最新价格和 will_paginate【英文标题】:Most recent prices and will_paginate 【发布时间】:2017-09-11 17:40:56 【问题描述】:我有两个型号Product
和Price
。 Product
可以有多个价格,每个价格都有不同的created_at
,所以我可以随时查看产品的价格历史记录。
我想在每个产品旁边显示最近价格的产品列表,并使用 will_paginate 对每页 10 个产品进行分页。
我在我的ProductsController
中写了这样的内容:
@products = Product.includes(:prices).references(:prices).
select('DISTINCT ON (products.id) *').
order('products.id, prices.created_at ASC').
paginate(page: params[:page])
当我为这个查询检查 .to_sql
时,我看到 will_paginate 添加了 WHERE \"products\".\"id\" IN (2, 2, 3, 3, 4, 4, 5, 5, 7, 7)
,而不是 10 个产品,我得到了 5 个。
当我尝试时:
Product.includes(:prices).references(:prices).
select('DISTINCT ON (products.id) *').
order('products.id, prices.created_at ASC').limit(10).pluck(:id)
我收到=> [2, 2, 3, 3, 4, 4, 5, 5, 7, 7]
知道如何更改它以获取 10 种可以访问最新价格的产品吗?
【问题讨论】:
您需要最近的 10 个价格,在您的情况下,最近的 10 个价格是重复的,只有五个是唯一的。您查询中的 `Distinct ' 确实删除了五个不同的。 你可以删除 Distinct,你只会得到五个。 id 怎么能有重复?它们应该是唯一的,因为它们是主键。 是join操作,所以可以有多个id 尝试按产品idGROUP BY "products.id".
对join结果分组
【参考方案1】:
我想我设法做到了这一点:
@products = Product.
select('DISTINCT ON(products.id) products.*, prices.value as recent_price').
joins('LEFT OUTER JOIN prices ON products.id = prices.product_id').
order('products.id ASC, prices.created_at DESC').
paginate(page: params[:page])
【讨论】:
我认为 DISTINCT 永远不会得到你需要的东西......你真的需要一个相关的子查询来获得你需要的东西。尝试先用直接的 SQL 编写它,然后尝试在 rails 中返回(或创建一个绑定到模型的 VIEW) 你能把两个模型的模型都贴出来吗? @BrettGreen,它是DISTINCT ON
,我认为它只适用于 Postgres。
有趣...没注意到。这就像 SQL Server 中的 WITH TIES。以上是关于最新价格和 will_paginate的主要内容,如果未能解决你的问题,请参考以下文章