1

以前に質問を投稿しました-自分のマシンでローカルに機能する素晴らしい回答を受け取ったORDERと組み合わせて使用​​ した場合のDISTINCTの問題。しかし、それをサーバーにプッシュしたとき、コードは結果に何もしませんでした...それ以来、ホストプロバイダーに連絡し、サーバー上のRubyのバージョンが1.8.7であることを発見しました

これを念頭に置いて、私が同等のことを行う方法を教えてくれる人はいますか

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

私たちのサーバーで実行される方法で?

そのままで@unique_resultsは同じで@filtered_namesあり、繰り返し名 (元の投稿で説明されているように) は出力に残ります。

御時間ありがとうございます

4

3 に答える 3

2

Rubyをマスターするための1つのステップは、「コア」操作として意味をなすのに十分一般的な機能が必要な場合に、コアクラスを拡張する方法を学ぶことです。プログラミングのバックグラウンドがあまり動的でない言語である場合、これには多少の慣れが必要です。この場合、次のようなものを追加します。

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用です)。

于 2012-02-06T10:19:14.623 に答える
2

Rails3.*を使用している場合は、 を使用できますArray#uniq_by

それ以外の場合は、その実装を調べて(Show sourceページをクリックして表示するのは非常に簡単です)、同様のことを行うか、クラスを再度開いてそのメソッドを自分Arrayで追加することができます。uniq_by

于 2012-02-06T08:45:27.637 に答える
2

Marc-André Lafortunebackportsを gem リストに追加できます。これには、 of のブロックuniqや他の多くのものが含まれます。uniqその 1 つだけが必要な場合は、バックポートから更新されたものを選択することもできます。

于 2012-02-06T08:53:41.010 に答える