Вы могли бы пойти длинный путь к сужению поиска, находя, что дублированный данные в первую очередь. Например, скажем, вы хотите найти каждую комбинацию имени и электронной почты, которые используются более одного раза.
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]». Остальные из них можно вытащить из базы данных по мере необходимости с помощью find.
> 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">]
И это также кажется, что вы хотите, чтобы добавить некоторые лучше валидацию кода для предотвращения дубликатов в будущем.
Edit:
Если вам нужно использовать большой молоток find_by_sql
, потому что Rails 2.2 и более ранние версии не поддерживают :having
с find
, должны работать и дать вам тот же массив, который я описал выше ,
User.find_by_sql("select * from users group by first,email having count(*) > 1")
Вы проверяете его перед сохранением нового пользователя или вам нужно найти дубликатов пользователей? – tommasop
Мне нужно найти дубликатов пользователей – Trace
У пользователей будут регулярно дублироваться имена пользователей.Если вы используете свои имена для предоставления уникальных учетных записей, вы без лишних ограничений ограничиваете свою пользовательскую базу. Вместо этого начните с адреса электронной почты, который будет уникальным в Интернете. –