Ruby on rails 根据对象的属性获取activerecord对象数组的唯一元素的最佳方法是什么?
在我的应用程序中,我试图根据丢失报告的两个属性仅显示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已经覆盖了这些方法
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