Удаление дубликатов из массива перед сохранением - PullRequest
0 голосов
/ 10 июля 2009

Я периодически получаю последние твиты с определенным хэштегом и сохраняю их локально. Чтобы предотвратить сохранение дубликатов, я использую метод ниже. К сожалению, это, похоже, не работает ... так что не так с этим кодом:

    def remove_duplicates
      before = @tweets.size
      @tweets.delete_if {|tweet| !((Tweet.all :conditions => { :twitter_id => tweet.twitter_id}).empty?) }
      duplicates = before - @tweets.size
      puts "#{duplicates} duplicates found"
    end

Где @tweets - это массив объектов Tweet, извлеченных из твиттера. Я был бы признателен за любое подходящее решение, особенно за более элегантное ...

Ответы [ 4 ]

2 голосов
/ 10 июля 2009

вы можете validate_uniqueness_of :twitter_id в модели Tweet (где этот код должен быть). Это приведет к невозможности сохранения дубликатов.

1 голос
/ 10 июля 2009

Поскольку, похоже, вы используете API поиска в Твиттере, лучшим решением будет использование параметра since_id. Следите за последним идентификатором статуса Twitter, который вы получили из предыдущего запроса, и используйте его в качестве параметра since_id в следующем запросе.

Более подробная информация доступна на Метод API поиска в Twitter: поиск

0 голосов
/ 11 июля 2009

Хорошо, выясняется, что проблема была немного другой природы: при ближайшем рассмотрении я обнаружил, что несколько твитов были сохранены с помощью twitter_id 2147483647 ... Это верхний предел для целочисленных полей:)

Изменение поля на bigint решило проблему. Мне потребовалось очень много времени, чтобы понять, так как MySQL молчал и терпел неудачу и просто возвращался к максимальному значению так долго, как мог. (пока я не добавил уникальный индекс). Я быстро попробовал это с postgres, который возвратил приятную ошибку «Integer вне диапазона», которая затем указала мне на реальную причину проблемы здесь.

Спасибо Бен за советы по проверке и индексированию, так как теперь они дают намного более чистый код!

0 голосов
/ 10 июля 2009

array.uniq!

Удаляет дубликаты элементов из себя. Возвращает ноль, если не было внесено никаких изменений (то есть дубликаты не найдены).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...