Эквивалент массива # Uniq в Ruby1.8.7 - PullRequest
1 голос
/ 06 февраля 2012

Я опубликовал вопрос ранее - Проблемы с DISTINCT при использовании вместе с ORDER , на который я получил отличный ответ, который работал локально на моей машине.Однако, когда я отправил его на сервер, код ничего не дал с результатами ... Я с тех пор связался с нашим хост-провайдером и обнаружил, что версия Ruby на сервере - 1.8.7

.Имея это в виду, кто-нибудь может сказать мне, как я могу сделать эквивалент

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

таким образом, чтобы он работал на нашем сервере?

В существующем виде @unique_results идентичен @filtered_names, а имена повторов (как описано в исходном посте) остаются на выходе.

Спасибо за ваше время

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Вы можете добавить Marc-André Lafortune backports в свой список драгоценных камней, который включает в себя блок для uniq и массу других вещей. Вы также можете выбрать обновленный uniq из бэкпорта, если вы просто хотите этот кусок.

2 голосов
/ 06 февраля 2012

Один шаг к овладению 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

Это будет не так эффективно, как uniq, встроенный в Ruby 1.9, но все равно O (n).

Добавление этого в Enumerable означает, что вы можете использовать его для других вещей, кроме массивов.Если определенный перечислимый класс определяет более эффективную версию, это не будет переопределять ее - алгоритм поиска метода Ruby сначала проверяет методы, определенные непосредственно в классе, прежде чем искать методы, определенные во включенных модулях.

Если вычасто используйте Ruby 1.8, вы можете добавить это в файл ваших собственных расширений ядра и использовать его в будущих проектах.Если вам интересно, вы можете увидеть некоторые из моих личных расширений ядра на https://github.com/alexdowad/showcase/blob/master/ruby-core/collections.rb (это для Ruby 1.9).

2 голосов
/ 06 февраля 2012

Если вы используете Rails 3.*, вы можете использовать Array#uniq_by.

В противном случае вы можете либо взглянуть на его реализацию (это довольно просто, нажмите Show source на странице, чтобы увидеть его) и сделать что-то подобное, либо просто заново открыть Array класс и добавить этот метод uniq_by самостоятельно.

...