如何检索由不同的属性值分组的记录为哈希(类似)?

时间:2016-03-16 06:48:17

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

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

我的模型的简化版本看起来像这样(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,关系就可以了。

我认为ActiveRecord可以很容易地构建这样的查询(可能带有group(:kind) - 语句,但是单独它不会帮助我,因为我不能 - 或者不知道如何 - 迭代在群组中获取“条目”。

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

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

代码示例:

Technology.kinds.map do |kind|
  [kind, Technology.where(kind: kind)]
end.to_h
  • 模型技术作为一个自己的实体。

ActiveRecord这样做的方法是什么?

1 个答案:

答案 0 :(得分:2)

group中的ActiveRecord方法等同于SQL GROUP BY,它与聚合函数(如sumcount)一起使用。据我所知,你不想使用聚合函数。

您可以使用Rails group_by method实现所需目标。它返回Hash,因此您可以轻松地遍历它。

您的代码应如下所示:

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

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