diff --git a/db/migrate/20110125190034_unique_index_on_profile.rb b/db/migrate/20110125190034_unique_index_on_profile.rb index 55461c258..05a727e33 100644 --- a/db/migrate/20110125190034_unique_index_on_profile.rb +++ b/db/migrate/20110125190034_unique_index_on_profile.rb @@ -1,6 +1,7 @@ class UniqueIndexOnProfile < ActiveRecord::Migration def self.up - columns = Profile.column_names + conn = ActiveRecord::Base.connection + columns = conn.columns("profiles").map{|c| c.name} ["id", "created_at", "updated_at"].each{|n| columns.delete(n)} sql = <<-SQL @@ -8,16 +9,19 @@ class UniqueIndexOnProfile < ActiveRecord::Migration GROUP BY #{columns.join(',')} HAVING COUNT(*)>1 AND `profiles`.person_id IS NOT NULL; SQL - result = Profile.connection.execute(sql) + result = conn.execute(sql) duplicate_person_ids = result.to_a.flatten undesired_profile_ids = [] duplicate_person_ids.each do |person_id| - ids = Profile.where(:person_id => person_id).map!{|p| p.id} - ids.pop - undesired_profile_id.concat(ids) + profile_ids = conn.execute(" + SELECT `profiles`.id FROM `profiles` + WHERE `profiles`.person_id = #{person_id};").to_a.flatten + profile_ids.pop + undesired_profile_ids.concat(profile_ids) end - Profile.where(:id => undesired_profile_ids).delete_all + conn.execute("DELETE FROM `profiles` + WHERE `profiles`.id IN (#{undesired_profile_ids.join(",")});") unless undesired_profile_ids.empty? remove_index :profiles, :person_id add_index :profiles, :person_id, :unique => true