模型User
具有first
,last
和login
作为属性。它还有一个名为name
的方法,可以加入first
和last
。
我想要的是遍历Users
记录并使用我想要的属性创建一个哈希数组。像这样:
results = []
User.all.map do |user|
record = {}
record["login"] = user.login
record["name"] = user.name
results << record
end
Ruby中有更清洁的方法吗?
答案 0 :(得分:3)
尝试映射User.all
会导致性能问题(稍后,如果不是现在)。要避免实例化所有User对象,可以使用pluck
直接从数据库中获取数据,然后映射它。
results = User.all.pluck(:login, :first, :last).map do |login, first, last|
{ 'login' => login, 'name' => first << last }
end
实例化所有用户将会出现问题。即使是as_json
关系方法也会这样做。使用此方法可能会出现问题,具体取决于有多少用户。
此外,这假定User#name
确实只是first + last
。如果它不同,您可以更改块中的逻辑。
答案 1 :(得分:2)
您可以使用ActiveRecord::QueryMethods#select
和ActiveRecord::Relation#as_json
:
User.select(:login, '(first || last) as name').as_json(except: :id)
答案 2 :(得分:1)
我会写:
results = User.all.map { |u| { login: u.login, name: u.name } }
答案 3 :(得分:0)
我认为,命名不佳且记录不良的方法ActiveRecord::Result#to_hash
可以满足您的需求。
User.select(:login, :name).to_hash
命名不佳,因为它实际上确实返回了一个Hash数组,这对于一个名为to_hash
的方法来说似乎很糟糕。