【问题标题】:How to get unique record by multi-attributes如何通过多属性获取唯一记录
【发布时间】:2016-06-15 23:22:14
【问题描述】:

我有一个这样的模型: order(id: integer, user_id: integer, target_id: integer, content: string, created_at: datetime, updated_at: datetime)

它属于用户。用户可以像这样互相订购:

  • A 人 -> B 人
  • B 人 -> A 人
  • A 人 -> B 人

=> 唯一记录应该是 A -> B,那么如何将订单过滤到唯一记录?

【问题讨论】:

  • 我不明白你所说的“A -> B”或“B -> A”是什么意思,你能换个方式解释一下吗?
  • 感谢您的回复。我的意思是 A 可以为 B 创建订单,反之亦然。
  • 你能澄清一下“过滤订单到唯一记录”是什么意思吗?您是否正在寻找一个查询,例如返回用户 A 下的所有订单,目标是用户 B?
  • @jmschles 我的意思是它只会返回用户 A 和用户 B 之间的一个订单(即使用户 A 向用户 B 发送了许多订单并且用户 B 也为用户 A 下订单)跨度>
  • 欢迎来到 Stack Overflow!为了让其他用户更容易帮助您,请包含一些代码,最好以Minimum, Complete, Verifiable Example 的形式。另请参阅How to Ask

标签: ruby-on-rails ruby


【解决方案1】:

好的,假设您有用户 A 和 B,您应该能够做到这一点:

Order.where(user: A, target: B)

...假设您已经定义了关联,否则:

Order.where(user_id: A.id, target_id: B.id)

编辑:刚刚看到您的评论。如果您愿意,您可以将.first 添加到上述任一查询中,以获得第一个订单。

另一个编辑:据我了解,如果 A 和 B(或 B 和 A)之间曾经有过一个或多个订单,您想抓住其中一个,而您不在乎哪个。你可以这样做:

(Order.where(user: A, target: B) + Order.where(user: B, target: A)).first

如果存在,它将为您提供记录,如果不存在,则为 nil。原始 SQL 会更高效:

Order.where("user_id = ? AND target_id = ? OR user_id = ? AND target_id = ?", A.id, B.id, B.id, A.id).first

...但可读性较差,请务必对其进行测试。祝你好运!

【讨论】:

  • 此查询不会返回唯一记录。我用过:Order.uniq.pluck(:user_id, :target_id) 返回:[[1,2],[1,14],[3,5],[1,23],[2,1],...] 那么有什么方法可以使用这个数组查询唯一顺序吗?!
  • 我仍然无法理解您所说的“唯一记录”是什么意思。听起来您是在说同一用户和目标可能有多个订单。因此,假设您上面的查询返回了[[1,2],[1,2]]。如果要查询其中一个,则需要一个以某种方式区分它们的字段。否则你只需要做一些任意的事情,比如抓住第一个或最后一个。
  • 嗯...作为您的新更新。那么如果有 (user_id: B, target_id: A) 的订单呢?!它会返回另一条记录吗?!
  • 是的,这是一个不同的查询,只会返回用户为 B 且目标为 A 的订单。
  • 好的。要更清楚。我的项目帮助用户 A 获取用户 B 的电话号码,用户 B 也可以获取用户 A 的电话号码(某种匹配的人)。我构建了一个仪表板来检查它们是否匹配。如您所见,无论是来自 A 或 B 的订单,还是他们下订单的次数,这只是 2 个人之间的联系。这就是为什么我想获得一个独特的记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多