Ruby:哈希:将一个记录属性用作键,将另一个记录属性用作值

时间:2018-07-09 18:04:03

标签: ruby-on-rails ruby

假设我有一个User,属性为namebadge_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

...尽管确实可以达到预期的效果,但性能会随着时间的推移而下降。

有什么比这个怪异,黏糊糊的循环更好的方法了吗?

2 个答案:

答案 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