通过组合多个列来组合结果集

时间:2016-03-07 01:49:46

标签: ruby-on-rails ruby postgresql activerecord

我的桌子叫做像这样的谈判

id    seller_id  buyer_id property_id
1        4           190      33123
2        4           190      33123
3        5           191      34000
4        5           191      34000
5        6           200      35000

我可以通过以下方式获取所有内容:

Negotiation.all

我想要抓取所有内容,但按seller_id - buyer_id - property_id组合分组。在上面的示例中,我想返回三个组。

这可以在我的rails应用程序中使用吗?

2 个答案:

答案 0 :(得分:5)

您可以使用Enumerable#group_by

Negotiation.all.group_by{ |x| [x.seller_id, x.buyer_id, x.property_id] }

答案 1 :(得分:0)

我想你可以实现这一点,创建一个范围,它会采用你在Negotiation模型中定义的一些参数。我不是100%正确的语法,但相信这种方法是最合适的。

scope :seller_buyer_property_combo, ->(seller, buyer, property) { 
   where("negotiations.seller_id = ? AND 
          negotiations.buyer_id = ? AND
          negotiations.property_id = ?", seller.id, buyer.id, property.id) }

此语法遵循给出here的建议:

例如,在Rails中,问号被库的编程语言(Ruby)的变量给出的参数替换,例如:

Table.where("column = ?", "value")

并自动引用参数以避免错误和SQL注入,生成如下语句:

SELECT * FROM Table WHERE column = 'value';

引用会在以下情况下保存我们:

Table.where("column = ?", "; INJECTION")

如果你想重复使用这些组合并且没有那么多,你可以将这些组合硬编码到几个不同的范围内(减少对args的需求,这可能会导致排序混乱等。)