在数组中选择与一个或多个属性相关的唯一对象的最优雅的方法是什么?
这些对象存储在ActiveRecord中,所以使用AR的方法也很好。
发布于 2012-04-10 13:57:31
对块使用Array#uniq
:
@photos = @photos.uniq { |p| p.album_id }
发布于 2008-09-22 08:18:32
将uniq_by
方法添加到项目中的数组中。它的工作原理类似于sort_by
。所以uniq_by
之于uniq
就像sort_by
之于sort
。用法:
uniq_array = my_array.uniq_by {|obj| obj.id}
实现:
class Array
def uniq_by(&blk)
transforms = []
self.select do |el|
should_keep = !transforms.include?(t=blk[el])
transforms << t
should_keep
end
end
end
请注意,它返回一个新的数组,而不是修改当前的数组。我们还没有编写uniq_by!
方法,但是如果您愿意的话,它应该很简单。
编辑: Tribalvibes指出该实现是O(n^2)。更好的方法是这样(未测试)...
class Array
def uniq_by(&blk)
transforms = {}
select do |el|
t = blk[el]
should_keep = !transforms[t]
transforms[t] = true
should_keep
end
end
end
发布于 2008-09-21 01:42:07
在数据库级别执行此操作:
YourModel.find(:all, :group => "status")
https://stackoverflow.com/questions/109781
复制相似问题