仅具有特定属性的地图方法

时间:2017-10-02 14:57:51

标签: ruby-on-rails

我有一个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映射?

1 个答案:

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