如何在Rails中使用group_by方法删除数组中的数据?

时间:2019-04-02 08:24:10

标签: ruby-on-rails ruby

我要删除的数据值已经group_by,因为对象@deals

我需要按日期排列数据。

但是,问题在于我使用了@period的迭代,并且会再次计算@deals中的值。效率不高,我尝试使用map方法进行切片数据如下:

@period = Date.new(2019,3,1)..Date.new(2019,3,31)
@deals = Deal.where(created_at: @period).includes(:staff).group_by{|t| t.staff}

@period.each do |date|
 @deals.map do |staff, deals|
  puts "staff:#{staff.name}"
  puts deals.count
  selected_deals = deals.select{|t| Date.parse(t.created_at) == date}
  puts selected_deals.select{|t| t.deal_product=="item1"}.count
  puts selected_deals.select{|t| t.deal_product=="item2"}.count
  puts selected_deals.select{|t| t.deal_product=="item3"}.count
  puts selected_deals.select{|t| t.deal_product=="item4"}.count
  deals-selected_deals
 end
end

但是它并没有删除我选择的数据。

可以做我想做的事吗?

1 个答案:

答案 0 :(得分:0)

.select不会更改数据,但是会返回一个新值,.map也是如此。尝试@period.map,然后将整个表达式分配给一个变量。

@data = @period.map do |date|
  @deals.map do |staff, deals|
    selected_deals = deals.select{|t| t.created_at.to_date == date}
    deals - selected_deals
  end
end

如果要拒绝数组中的值,请使用.reject

@data = @period.map do |date|
  @deals.map do |staff, deals|
    deals.reject{|t| t.created_at.to_date == date}
  end
end