Ruby - 如何有效地从对象中获取和分组某些信息?
Ruby - how to effectively fetch and group certain information from an object?
我有一个包含数万个订单的对象。对象看起来像这样:
[#<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
对象中提取信息的最有效方法是什么?这将在一天内完成几次。
谢谢。
你可以这样做
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"}]}]
我最终会成为一些主持人,比如 PORO(普通的旧 ruby 对象)
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
我有一个包含数万个订单的对象。对象看起来像这样:
[#<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
对象中提取信息的最有效方法是什么?这将在一天内完成几次。
谢谢。
你可以这样做
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"}]}]
我最终会成为一些主持人,比如 PORO(普通的旧 ruby 对象)
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