如何通过多属性获取唯一记录

时间:2016-06-15 23:22:15

标签: ruby-on-rails ruby

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

它属于User。用户可以互相订购,如:

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

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

1 个答案:

答案 0 :(得分:0)

好的,假设你有用户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

...但不太可读,请务必测试。祝你好运!