Ruby on rails 根据对象的属性获取activerecord对象数组的唯一元素的最佳方法是什么?

Ruby on rails 根据对象的属性获取activerecord对象数组的唯一元素的最佳方法是什么?,ruby-on-rails,arrays,activerecord,Ruby On Rails,Arrays,Activerecord,在我的应用程序中,我试图根据丢失报告的两个属性仅显示activerecord对象数组(丢失报告)的唯一元素 模式 class Agent < ActiveRecord::Base has_many :loss_reports, :through => policy end class LossReport < ActiveRecord::Base belongs_to :agent end 但是很快就删除了代码,因为ActiveRecord已经覆盖了这些方法

在我的应用程序中,我试图根据丢失报告的两个属性仅显示activerecord对象数组(丢失报告)的唯一元素

模式

class Agent < ActiveRecord::Base
  has_many :loss_reports, :through => policy  
end

class LossReport < ActiveRecord::Base
  belongs_to :agent  
end
但是很快就删除了代码,因为ActiveRecord已经覆盖了这些方法,我也不确定会有什么影响

选项2:

class Agent ...
  def unique_losses
    loss_reports.sort{|l1,l2| l2.created_at <=> l1.created_at}.group_by{|l| (l.policy_id + l.loss_occurred_on.hash)}.collect{|hl| hl[-1].first}
  end
end  
类代理。。。
唯一损失
loss|u reports.sort{l1,l2 | l2.created|u at l1.created|u at}.group_by{l | l |(l.policy_id+l.loss|u Occurrent_on.hash)}.collect{hl hl hl[-1]。first}
结束
结束
选项3:

 class Agent
   def unique_losses
     hsh_array = []
     unique = []
     loss_reports.sort{|l1,l2| l2.created_at <=> l1.created_at}.each do |l|
       unique << l unless hsh_array.include?(l.hsh)
       hsh_array << l.hsh
     end
     unique         
   end
 end
类代理
唯一损失
hsh_数组=[]
唯一=[]
损失报告。排序{l1,l2{l2.created_at l1。created_at}。每个do|l|

独特的我不知道基准测试,但似乎
inject
将是最简单的方法:

loss_reports.inject([]) do |arr, report|
  arr << report unless arr.detect{|r| ... } 
end
loss_报告。注入([])do| arr,报告|

arr我不知道基准测试,但似乎
inject
将是最简单的方法:

loss_reports.inject([]) do |arr, report|
  arr << report unless arr.detect{|r| ... } 
end
loss_报告。注入([])do| arr,报告|

arr不知道为什么,但agent.loss_报告(:order=>'created_at desc')没有对结果agent进行排序。loss_报告(:order=>'created_at desc')没有对结果进行排序,因为agent.loss_报告使用的参数与ActiveRecord::Base.find使用的参数不同。(只需要一个布尔参数:reload(re run DB query)(如果为true。)使用agent.loss_reports.find(:all,:order=>'created_at desc')来执行此操作。不知道为什么,但是agent.loss_reports(:order=>'created_at desc')没有对结果代理进行排序。loss_reports(:order=>'created_at desc'))未对结果排序,因为agent.loss_报告采用的参数与ActiveRecord::Base.find采用的参数不同。(它只需要一个布尔参数:reload(如果为true,则重新运行DB query。)使用agent.loss_reports.find(:all,:order=>'created_at desc')来完成此操作。很棒的建议-在处发现了一个类似的问题,示例是使用命名的_scope。很棒的建议-在处发现了一个类似的问题,示例是使用命名的_scope。
loss_reports.inject([]) do |arr, report|
  arr << report unless arr.detect{|r| ... } 
end