最新价格和 will_paginate

Posted

技术标签:

【中文标题】最新价格和 will_paginate【英文标题】:Most recent prices and will_paginate 【发布时间】:2017-09-11 17:40:56 【问题描述】:

我有两个型号ProductPriceProduct 可以有多个价格,每个价格都有不同的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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mysql 查询中获取最新的商品价格?

SQL查询从数据中获取最新价格?

字符串和数值类型比较大小

chia价格《报价》chia币挖矿矿机最新报价;chia币挖矿最新行情

如何选择产品的最新价格? [复制]

使用SQL查询物料最新采购价格的示例