我有一个Book模型和一个User模型。用户有很多书。
从我的架构:
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "full_name"
t.string "gender"
t.integer "age"
t.string "country"
t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
end
我的目标是将User模型映射到用户对象数组中:
[{...},{...},{...}]
仅包含属性的对象:
{id: 15, full_name: "Tim Test"}
我可以使用
来映射书籍中的用户@user = @books.map { |u| u.user }.uniq
但是我怎样才能使用属性id和full_name映射?
答案 0 :(得分:2)
使用pluck
,这是做你想做的最便宜的方式:
User.pluck(:id, :fullname)
#=>[[1, "Tim Test1"]
# [2, "Tim Test2"]]
然后你可以简单地迭代它。
在这种情况下,您不会创建繁重的ActiveRecord对象,因此它比select
更快,占用的内存更少。
如果您希望结果与您的问题完全相同,则可以简单地构建它:
User.pluck(:id, :fullname)
.map { |e| [:id, :fullname].zip(e).to_h }