Я периодически получаю последние твиты с определенным хэштегом и сохраняю их локально. Чтобы предотвратить сохранение дубликатов, я использую метод ниже. К сожалению, это, кажется, не работает ... так что не так с этим кодом:Удаление дубликатов из массива перед сохранением
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 является массив комании объектов извлекается из твиттера. Я был бы признателен за любое решение, которое работает, и особенно тот, который может быть более изящным ...
validate_uniqueness_of: twitter_id это нехорошее решение. Между тем, когда он проверяет существование записи и создает новую запись, другой процесс может создать дубликат. Вы всегда должны использовать этот метод в сочетании с индексом базы данных. –
@weppos: Поскольку у меня есть только одна последовательная работа над написанием твитов, это не проблема. Это, по-видимому, самое «сухое» решение. Хорошо работал на sqlite3, но в режиме производства/mysql он, похоже, не замечает дубликатов ... глядя в него сейчас. – effkay
для реальной безопасности, вы должны установить ограничения уникальности в базе данных и просто быть готовыми к обработке любых исключений, которые были сброшены –