假设我有一个User
,属性为name
和badge_number
对于JavaScript自动填充字段,我希望用户能够开始输入用户名并获得选择列表。
我正在使用noskio's answer来提供所需的JS,我只需要以以下格式提供数据:
data: { "Sarah Person": 13241, "Billiam Gregory": 54665, "Stephan Stevenston": 98332 }
这不会:
User.select(:name, :badge_number) => { name: "Sarah Person", badge_number: 13241, ... }
这感觉是重复的,讨厌的和多余的(和重复的):
user_list = User.select(:name, :badge_number)
hsh = {}
user_list.each do |user|
hsh[user.name] = user.badge_number
end
hsh
...尽管确实可以达到预期的效果,但性能会随着时间的推移而下降。
有什么比这个怪异,黏糊糊的循环更好的方法了吗?
答案 0 :(得分:2)
这将提供所需的输出
User.pluck(:name, :badge_number).to_h
修改
尽管上面的代码只是一个衬里,但它内部仍然有循环。在处理太多行时,将此类循环卸载到数据库可能会提高性能。但是,没有数据库不可知的方法可以在活动记录中实现这一目标。按照this answer在Postgres中实现此目标
答案 1 :(得分:1)
如果您的RDBMS是Postgresql,则可以在这种情况下使用Postgresql函数json_build_object
。
User.select("json_build_object(name, badge_number) as json_col")
.map(&:json_col)
整个json也可以使用Postgresql提供的函数来构建。
User.select("array_to_json(array_agg(json_build_object(name, badge_number))) as json_col")
.limit(1)[0]
.json_col