Rails 和 PostgreSQL 的问题

Posted

技术标签:

【中文标题】Rails 和 PostgreSQL 的问题【英文标题】:Rails and PostgreSQL issue with Having 【发布时间】:2013-04-26 10:07:07 【问题描述】:

我正在尝试从以下 Action 表中检索一个表:

列:ID、Name、Status、Product_ID、User_ID 和其他几个与此问题无关的列。

每次用户想要产品时,我都会创建这样的记录: Name = Want,Status = True,Product_ID = 所需产品的 ID,User_ID 是用户的 ID。

然后,每当用户不想要产品时,我都会创建如下记录: Name = Want,Status = False,Product_ID = 不需要的产品 ID,User_ID 是用户的 ID。

我这样做是因为我的表中有其他操作的名称。

现在我想检索所有想要的产品,所以我应该检索按按 created_at 降序排序的特定用户的 product_id 分组的所有最后想要的操作,然后只检索 status = true 的操作。

因此,为了获得按 product_id 为用户分组的所有最后想要的操作,我这样做了:

Action.select("DISTINCT ON (product_id) product_id,created_at, status, * ").where(user_id   == id) & (name == 'want').group("product_id, id, status").order(' product_id,created_at DESC')

检索每个产品和用户的最后操作,但同时检索真假状态 唯一的问题是我不知道如何过滤此表以仅在其为真时才获取操作。

我试着这样做:

Action.select("DISTINCT ON (product_id) product_id,created_at, status, * ").where(user_id == id) & (name == 'want').group("product_id, id, status").having("status = 'true'").order(' product_id,created_at DESC')

但这会给我最后一个想要=真的动作。如果最后一个动作是 status = false,它将在 status = true 时检索之前的那个。

这是我想要的想法,但我不知道如何使用 rails 来实现: http://sqlfiddle.com/#!9/e4117/3

【问题讨论】:

【参考方案1】:

您可以尝试在条件中添加子选择并通过以下方式删除组:

Action.
  where( user_id: id, name: "want", status: "true").
  where( ["id IN (SELECT max(id) FROM actions WHERE user_id = ?
              AND name = 'want' GROUP BY product_id)", id]).
  order( "product_id")

您需要依赖 id 列的顺序才能使其正常工作。如果你不能这样做,你可以在子选择中使用 DISTINCT ON:

Action.
  where( user_id: id, name: "want", status: "true").
  where( ["id IN (SELECT DISTINCT ON (product_id) id FROM actions
              WHERE user_id = ? AND name = 'want'
              ORDER BY product_id, created_at DESC)", id]).
  order( "product_id")

【讨论】:

如果我这样做,那将给我所有的状态为真,但如果我有:最后一项是状态假并且最后一项之前的项目是真的,它会给我最后一项之前的项目.如果它不是最后一项,我希望它不返回任何内容。谢谢, 谢谢一个问题:ORDER BY product_id, created_at DESC)", user_id]). order("product_id") user_id 应该是 id 吗?谢谢,

以上是关于Rails 和 PostgreSQL 的问题的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 通知和带有 Rails 的 WebSockets

rails3、postgresql 和 postGIS:在迁移中冻结

使用 PostgreSQL 的模式和 Rails 创建多租户应用程序

在 macOS Big Sur 11.2.3 上安装 ruby​​、rails 和 postgresql 时安装 xcode 的问题

带表达式的多列索引(PostgreSQL 和 Rails)

Rails 在应用程序 ubuntu 中与 Postgresql 数据库连接