【问题标题】:Group result set by combination of multiple columns [closed]通过多列的组合对结果集进行分组[关闭]
【发布时间】:2016-03-07 01:49:45
【问题描述】:

我有这样的谈判桌

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 应用程序中可行吗?

【问题讨论】:

  • 您所说的“按seller_id-buyer_id-property_id 分组”是什么意思?我可以看到这三个组,但结果会是什么样子?

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

你可以使用Enumerable#group_by

Negotiation.all.group_by do |item| 
  [item.seller_id, item.buyer_id, item.property_id]
end

【讨论】:

  • 哇,真不敢相信以前没有在 SO 上问过这个问题
【解决方案2】:

我想您可以通过创建一个包含您在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 的需求,这可能会导致排序混乱等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多