2012-02-06 61 views
1

我之前发布了一个问题 - Issues with DISTINCT when used in conjunction with ORDER,我收到了一个很好的答案,在本地机器上工作。然而,当我将它推送到服务器时,代码没有对结果做任何事情......我已经联系了我们的主机提供商,发现服务器上Ruby的版本是1.8.7等效的Array#Uniq在Ruby1.8.7中

有了这个心灵,是任何人能告诉我,我怎么能在我们将服务器上运行的方式做的

@unique_results = @filtered_names.uniq { |result| result.athlete_id }

等价?

按照原样@unique_results@filtered_names相同,并且重复名称(如原始帖子中所述)保留在输出中。

感谢您的时间

回答

2

如果您使用Rails的3.*可以使用Array#uniq_by

否则,您可以看看它的实现(这是非常简单,点击Show source在页面上看到它),做未便类似或者只是重新Array类,并添加uniq_by方法自己。

2

您可以将Marc-André Lafortunebackports添加到您的宝石列表中,其中包括uniq以及其他大量的东西。如果你只想要那一块,你也可以从后台挑选更新后的uniq

+0

* 1为漂亮的图书馆。 – lucapette 2012-02-06 10:20:21

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)上看到我的个人核心扩展。