如何让ActiveRecord的pluck也返回用于在json中渲染的列名?

 Eminem被注册了 发布于 2023-02-07 21:51

vee的答案很好,但我有一点需要注意.为结果中的每一行select实例化a User,但pluck不是.如果你只返回一些对象并不重要,但是如果你要返回大批量(50,100等),你将会付出很大的性能损失.

我遇到了这个问题,然后我又回到了采摘:

#in user.rb
def self.pluck_to_hash(keys)
  pluck(*keys).map{|pa| Hash[keys.zip(pa)]}
end

#in elsewhere.rb
User.limit(:10).pluck_to_hash(['id, name, email, created_at'])

这很丑陋,但它可以获得你想要的哈希,而且速度很快.

我更新了它以反映Mike Campbell在10月11日的评论.

3 个回答
  • vee的答案很好,但我有一点需要注意.为结果中的每一行select实例化a User,但pluck不是.如果你只返回一些对象并不重要,但是如果你要返回大批量(50,100等),你将会付出很大的性能损失.

    我遇到了这个问题,然后我又回到了采摘:

    #in user.rb
    def self.pluck_to_hash(keys)
      pluck(*keys).map{|pa| Hash[keys.zip(pa)]}
    end
    
    #in elsewhere.rb
    User.limit(:10).pluck_to_hash(['id, name, email, created_at'])
    

    这很丑陋,但它可以获得你想要的哈希,而且速度很快.

    我更新了它以反映Mike Campbell在10月11日的评论.

    2023-02-07 21:59 回答
  • 使用select而不是pluck:

    def jsontest
      @users = User.select('id, name, email, created_at').limit(10)
      render json: @users
    end
    

    2023-02-07 21:59 回答
  • 创造了一个简单的pluck_to_hash宝石来实现这一目标. https://github.com/girishso/pluck_to_hash

    用法示例..

    Post.limit(2).pluck_to_hash([:id, :title])
    #
    # [{:id=>213, :title=>"foo"}, {:id=>214, :title=>"bar"}]
    #
    
    Post.limit(2).pluck_to_hash(:id)
    #
    # [{:id=>213}, {:id=>214}]
    #
    
    # Or use the shorter alias pluck_h
    
    Post.limit(2).pluck_h(:id)
    #
    # [{:id=>213}, {:id=>214}]
    #
    

    2023-02-07 22:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有