【问题标题】:How to retrieve records grouped by distinct atribute values as hash(-like)?如何检索按不同属性值分组的记录作为哈希(-like)?
【发布时间】:2016-03-16 06:48:16
【问题描述】:

我正在使用rails 4.2.xsimple_form,我的目标是使用 optgroups 创建一个选择框,其中模型属性的唯一值是组。

我的模型的简化版本如下所示(kind 是数据库表中的 integer 列):

# app/models/technology.rb
class Technology < ActiveRecord::Base
  enum kind: {
    programming_language: 1, framework: 2, skill: 3, application: 4, technology: 5
  }
end

例如,我拥有三种技术:

t1 = Technology.create!(name: "Ruby", kind: :programming_language)
t2 = Technology.create!(name: "Java", kind: :programming_language)
t3 = Technology.create!(name: "Ruby on Rails", kind: :framework)

我想要一个查询结果:

groups = Technology.magical_query(:kind)
# groups => { programming_language: [t1, t2],
#             framework: [t3] }

返回值不必包含ArrayHash,Relation 就可以了。

我假设ActiveRecord 可以很容易地构建这样的查询(可能使用group(:kind) - 语句,但单独它对我没有帮助,因为我不能 - 或者不知道如何 - 迭代组和获取它的“条目”)。

有非魔法的“变通办法”或替代模式:

  • 首先获取属性的不同值(在我的示例中,它是一个枚举,所以我实际上事先知道这些值),然后触发单独的查询并将它们粘合在一起。但我想避免多次数据库命中。

代码示例:

Technology.kinds.map do |kind|
  [kind, Technology.where(kind: kind)]
end.to_h
  • 将 TechnologyKind 建模为一个自己的实体。

纯粹的ActiveRecord 方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rails-activerecord


    【解决方案1】:

    来自ActiveRecordgroup 方法等效于SQL GROUP BY,它与聚合函数(如sumcount)一起使用。据我了解,您不想使用聚合函数。

    您可以使用Rails group_by method 实现您想要的。它返回一个Hash,因此您可以轻松地遍历它。

    您的代码应如下所示:

    groups = Technology.all.group_by(&:kind)
    programming_languages = groups['programming_language']
    

    所以programming_languages 存储您的示例中的[t1, t2]

    【讨论】:

    • 但是对于拥有数十万条记录的数据库,我想最好只得到一个总和而不是一个值的哈希值。知道如何使用 group_by 和 sum 来做到这一点吗?
    • 您能否提供更多上下文 - 我不确定您的问题是什么。如果你想得到总和,你可能需要使用ActiveRecord 中的groupsum 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多