2010-05-07 3 views
0

Предположим, у меня есть массив объектов из того же класса, здесь есть два атрибута: name и created_at.Удаление «дублирующих объектов»

Как найти объекты с таким же именем (считается дублированием) в массиве, а затем удалить дублируемую запись в базе данных. Однако объект с самой последней датой created_at является тем, который необходимо удалить.

ответ

2
seen = [] 
#sort by created date and iterate 
collection.sort({|a,b| a.created_at <=> b.created_at}).each do |obj| 
    if seen.map(&:name).include? obj.name #check if the name has been seen already 
    obj.destroy! 
    else 
    seen << obj #if not, add it to the seen array 
    end 
end 

Должен делать работу, надеюсь.

+0

была ошибка синтаксиса здесь, но я получил его на работу. спасибо! – keruilin

+0

О, извините, пропустил этот, теперь нужно исправить. –

+0

Было бы лучше сделать 'seen = Set.new'. Таким образом, 'include? 'Является O (1) вместо O (n). –

0

Если это только один раз багфикса перед введением UNIQUE INDEX на столе, вы можете также сделать это в SQL:

DELETE FROM t WHERE id IN (
    SELECT t1.id 
    FROM t t1 
    LEFT JOIN t t2 ON t1.name = t2.name AND t2.created_at < t1.created_at 
    WHERE t2.id IS NOT NULL 
) 
Смежные вопросы