Вы можете пройти долгий путь, чтобы сузить область поиска, выяснив, в первую очередь, что представляют собой дублированные данные. Например, предположим, что вы хотите найти каждую комбинацию имени и адреса электронной почты, которая используется более одного раза.
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
Это вернет массив, содержащий одну из каждой из дублированных записей. Исходя из этого, скажем, у одного из возвращенных пользователей были «Fred» и «[email protected]», тогда вы можете искать только пользователей, имеющих эти значения, чтобы найти всех затронутых пользователей.
Возврат от этого find
будет примерно следующим. Обратите внимание, что массив содержит только одну запись из каждого набора дублированных пользователей.
[#<User id: 3, first: "foo", last: "barney", email: "[email protected]", created_at: "2010-12-30 17:14:43", updated_at: "2010-12-30 17:14:43">,
#<User id: 5, first: "foo1", last: "baasdasdr", email: "[email protected]", created_at: "2010-12-30 17:20:49", updated_at: "2010-12-30 17:20:49">]
Например, первый элемент в этом массиве показывает одного пользователя с «foo» и «[email protected]». Остальные их можно вытаскивать из базы по мере надобности при находке.
> User.find(:all, :conditions => {:email => "[email protected]", :first => "foo"})
=> [#<User id: 1, first: "foo", last: "bar", email: "[email protected]", created_at: "2010-12-30 17:14:28", updated_at: "2010-12-30 17:14:28">,
#<User id: 3, first: "foo", last: "barney", email: "[email protected]", created_at: "2010-12-30 17:14:43", updated_at: "2010-12-30 17:14:43">]
И также кажется, что вы захотите добавить лучшую проверку в свой код, чтобы предотвратить дублирование в будущем.
Изменить:
Если вам нужно использовать большой молот find_by_sql
, поскольку Rails 2.2 и более ранние версии не поддерживали :having
с find
, следующее должно сработать и дать вам тот же массив, который я описал выше.
User.find_by_sql("select * from users group by first,email having count(*) > 1")
30.12.2010
find_by_sql
и ручному созданию группы / наличия предложений, но я тоже немного покопаюсь для вас. api.rubyonrails.org/classes/ActiveRecord/ 30.12.2010