Вы могли бы пройти долгий путь к сужению поиска, выяснив в первую очередь дублированные данные.Например, скажем, вы хотите найти каждую комбинацию имени и адреса электронной почты, которая используется более одного раза.
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
Это вернет массив, содержащий одну из каждой дублированной записи.Исходя из этого, скажем, у одного из возвращенных пользователей были «Fred» и «fred@example.com», тогда вы можете искать только тех пользователей, у которых есть эти значения, чтобы найти всех затронутых пользователей.
Возвращение от этого find
будет что-то вроде следующего.Обратите внимание, что массив содержит только одну запись из каждого набора дублированных пользователей.
[#<User id: 3, first: "foo", last: "barney", email: "foo@example.com", created_at: "2010-12-30 17:14:43", updated_at: "2010-12-30 17:14:43">,
#<User id: 5, first: "foo1", last: "baasdasdr", email: "abc@example.com", created_at: "2010-12-30 17:20:49", updated_at: "2010-12-30 17:20:49">]
Например, первый элемент в этом массиве показывает одного пользователя с "foo" и "foo@example.com".Остальные из них могут быть извлечены из базы данных по мере необходимости с помощью поиска.
> User.find(:all, :conditions => {:email => "foo@example.com", :first => "foo"})
=> [#<User id: 1, first: "foo", last: "bar", email: "foo@example.com", created_at: "2010-12-30 17:14:28", updated_at: "2010-12-30 17:14:28">,
#<User id: 3, first: "foo", last: "barney", email: "foo@example.com", 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")