def jsontest
@users = User.all.limit(10)
render json: @users
end
Run Code Online (Sandbox Code Playgroud)
产量
{
...
"id": 7,
"name": "Sage Smith",
"email": "example-6@railstutorial.org",
"created_at": "2013-10-17T02:29:15.638Z",
"updated_at": "2013-10-17T02:29:15.638Z",
"password_digest": "$2a$10$taHk3udtWN61Il5I18akj.E90AB1TmdL1BkQBKPk/4eZ7YyizGOli",
"remember_token": "118f807d0773873fb5e4cd3b5d98048aef4f6f59",
"admin": false
...
}
Run Code Online (Sandbox Code Playgroud)
但是我想省略这个API的某些特定字段,所以我使用了 pluck
def jsontest
@users = User.all.limit(10).pluck(:id, :name, :email, :created_at) ###
render json: @users
end
Run Code Online (Sandbox Code Playgroud)
但是当我想通过散列键访问每个对象的属性时,pluck返回一个只有值的数组.
[
...
7,
"Sage Smith",
"example-6@railstutorial.org",
"2013-10-17T02:29:15.638Z"
...
]
Run Code Online (Sandbox Code Playgroud)
那么我怎样才能有效地获取值及其键?
我意识到我可以通过@users扫描并在拔除之前抓住密钥并重新创建哈希,但我希望有一些方便的方法可以完全符合我的要求.
假设你想要
records = Model.all
records.to_a.map{|m| m.serializable_hash(:root => true)}
Run Code Online (Sandbox Code Playgroud)
就像to_json(:root => true)那样
[
{
"model": {
"attribute_1": "value_1",
"attribute_2": "value_2",
}
}
...
]
Run Code Online (Sandbox Code Playgroud) 我看到了这个...
并且想要创建一个允许我将任何作用域或非作用域记录集转换为散列数组的方法.我把它添加到我的模型中:
def self.to_hash
to_a.map(&:serializable_hash)
end
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误.
NameError: undefined local variable or method `to_a' for #<Class:0x007fb0da2f2708>
Run Code Online (Sandbox Code Playgroud)
任何的想法?
我正在创建一个原始 SQL upsert,并且有相当大的 ActiveRecord 关系数组,需要将其转换为哈希值。我需要将哈希值与我选择的参数之一联系起来,以便我可以快速获取该值。
我使用 as_json 找到了这个响应,我几乎可以使用它得到我需要的东西,但它并不完全在那里。
profiles = Profile.all.select(:id, :foo) #returns an array of ActiveRecord Relations
profiles = profiles.as_json
Run Code Online (Sandbox Code Playgroud)
产量
{:id => 123, :foo => "bar"}
{:id => 456, :foo => "baz"}
Run Code Online (Sandbox Code Playgroud)
但我想要的是
{123 => "bar", 456 => "baz"}
Run Code Online (Sandbox Code Playgroud)
我意识到我可以将 as_json 的结果映射到新的哈希,但我必须在几百万条记录上相当频繁地运行它。这也是更大的 rake 任务的一小部分,我想继续循环所有记录到最小限度。
我手动完成这一切而不是让 ActiveRecord 处理的原因是,运行该任务最初需要 24 小时以上,甚至使用activerecord-import也只能将其速度加快到约 12 小时。我选择根据这篇博文中的基准使用原始 SQL