2012-02-06 20 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)上看到我的個人核心擴展。