我之前发布了一个问题 - Issues with DISTINCT when used in conjunction with ORDER,我收到了一个很好的答案,在我的机器上本地工作。但是,当我将它推送到服务器时,代码没有对结果做任何事情......我已经联系了我们的主机提供商,发现服务器上的Ruby版本是1.8.7
考虑到这一点,是否有人能够告诉我如何能够做到相当于
@unique_results = @filtered_names.uniq { |result| result.athlete_id }
以某种方式在我们的服务器上运行?
目前@unique_results
与@filtered_names
相同,重复名称(如原始帖子中所述)保留在输出中。
感谢您的时间
答案 0 :(得分:2)
如果您使用的是Rails 3.*
,则可以使用Array#uniq_by
。
否则你可以查看它的实现(它非常简单,点击页面上的Show source
查看)并做类似的或只是重新打开Array
类并添加uniq_by
方法你自己。
答案 1 :(得分:2)
您可以将Marc-André Lafortune的backports添加到您的宝石列表中,其中包括uniq
的阻止以及大量其他内容。如果你只是想要那一件,你也可以选择更新后的uniq
。{/ p>
答案 2 :(得分:2)
掌握Ruby的一个步骤是学习在需要一些足够通用的功能时扩展核心类作为“核心”操作。如果你的编程背景是动态较少的语言,这将需要一些人习惯。在这种情况下,我会添加这样的东西:
require 'set'
module Enumerable
def uniq(&b)
if block_given?
self.map(&b).to_set.to_a
else
self.to_set.to_a
end
end
end
它不如Ruby 1.9内置的uniq
有效,但它仍然是O(n)。
将此添加到Enumerable意味着您可以在阵列以外的其他内容上使用它。如果某个可枚举类定义了更高效的版本,则不会覆盖它 - Ruby方法查找算法首先检查直接在类中定义的方法,然后查找包含模块中定义的方法。
如果您经常使用Ruby 1.8,可以将其添加到您自己的个人核心扩展的文件中,并在将来的项目中使用它。如果您有兴趣,可以在https://github.com/alexdowad/showcase/blob/master/ruby-core/collections.rb看到我的个人核心扩展(这些是针对Ruby 1.9)。