我正在使用rails 4.2.x
和simple_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] }
返回的值不必包含Array
或Hash
,关系就可以了。
我认为ActiveRecord
可以很容易地构建这样的查询(可能带有group(:kind)
- 语句,但是单独它不会帮助我,因为我不能 - 或者不知道如何 - 迭代在群组中获取“条目”。
有非神奇的“变通办法”或替代模式:
代码示例:
Technology.kinds.map do |kind|
[kind, Technology.where(kind: kind)]
end.to_h
纯ActiveRecord
这样做的方法是什么?
答案 0 :(得分:2)
group
中的ActiveRecord
方法等同于SQL GROUP BY
,它与聚合函数(如sum
或count
)一起使用。据我所知,你不想使用聚合函数。
您可以使用Rails group_by method实现所需目标。它返回Hash
,因此您可以轻松地遍历它。
您的代码应如下所示:
groups = Technology.all.group_by(&:kind)
programming_languages = groups['programming_language']
所以programming_languages
存储了您示例中的[t1, t2]
。