【发布时间】:2016-03-16 06:48:16
【问题描述】:
我正在使用rails 4.2.x 和simple_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] }
返回值不必包含Array 或Hash,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