【问题标题】:Ruby - how to effectively fetch and group certain information from an object?Ruby - 如何有效地从对象中获取和分组某些信息?
【发布时间】:2020-12-01 10:37:03
【问题描述】:

我有一个包含数万个订单的对象。对象如下所示:

[#<Order id: 4304, order_code: 'AB11', manufacturer_id: 24, ...>, 
 #<Order id: 7664, order_code: 'AB13', manufacturer_id: 24, ...>, 
 #<Order id: 4164, order_code: 'AB255', manufacturer_id: 724, ...>, 
 #<Order id: 7671, order_code: 'AX88', manufacturer_id: 855, ...>,
...]  

现在,我想得到什么 - 我想要一个看起来像这样(或类似的东西)的对象:

[ 
  {manufacturer_id: 24, orders: [{id: 4304, order_code: 'AB11'}, {id: 7664, order_code: 'AB13'}]},
  {manufacturer_id: 724, orders: [{id: 4164, order_code: 'AB255'}]},
  ...
]

从给定的Order 对象中提取该信息的最有效方法是什么?这将每天执行几次。

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql object model


    【解决方案1】:

    你可以这样做

    list.group_by(&:manufacturer_id).map do |k,v| 
      { 
        manufacturer_id: k, 
        orders: v.collect{ |o| {id: o.id, order_code: o.order_code }}  
      }      
    end  
    

    输出如下所示

    => [{:manufacturer_id=>24, :orders=>[{:id=>4304, :order_code=>"AB11"}, {:id=>7664, :order_code=>"AB13"}]}, {:manufacturer_id=>724, :orders=>[{:id=>4164, :order_code=>"AB255"}]}, {:manufacturer_id=>855, :orders=>[{:id=>7671, :order_code=>"AX88"}]}]
    

    【讨论】:

      【解决方案2】:

      我最终会成为一些演示者,比如 PORO(普通的旧红宝石对象)

      
      class OrderPresenter
        attr_reader :records
      
        def initialize(records)
          @records = records
        end
      
        def as_json
          records.group_by(&:manufacturer_id).map do |k, v| 
            { 
              manufacturer_id: k, 
              orders: v.collect { |o| {id: o.id, order_code: o.order_code } }  
            }      
          end  
        end
      end
      

      而且我认为您不需要一次全部使用它们? 所以你可以做一些像部分加载这样的事情,而不是炸毁你所有的记忆

      records.each_slice(1000) do |group|
        data = OrderPresenter.new(records).as_json
        # perform something on that data
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        相关资源
        最近更新 更多