diff --git a/db/migrate/20110125190034_unique_index_on_profile.rb b/db/migrate/20110125190034_unique_index_on_profile.rb index aff7cf70f..de27e44d3 100644 --- a/db/migrate/20110125190034_unique_index_on_profile.rb +++ b/db/migrate/20110125190034_unique_index_on_profile.rb @@ -1,27 +1,30 @@ class UniqueIndexOnProfile < ActiveRecord::Migration + class Profile < ActiveRecord::Base; end def self.up - conn = ActiveRecord::Base.connection - columns = conn.columns("profiles").map{|c| c.name} - ["id", "created_at", "updated_at"].each{|n| columns.delete(n)} + if Profile.count > 0 + conn = ActiveRecord::Base.connection + columns = conn.columns("profiles").map{|c| c.name} + ["id", "created_at", "updated_at"].each{|n| columns.delete(n)} - sql = <<-SQL - SELECT profiles.person_id FROM profiles - GROUP BY #{columns.join(',')} - HAVING COUNT(*)>1 AND profiles.person_id IS NOT NULL; - SQL - result = conn.execute(sql) - duplicate_person_ids = result.to_a.flatten + sql = <<-SQL + SELECT profiles.person_id FROM profiles + GROUP BY #{columns.join(',')} + HAVING COUNT(*)>1 AND profiles.person_id IS NOT NULL; + SQL + result = conn.execute(sql) + duplicate_person_ids = result.to_a.flatten - undesired_profile_ids = [] - duplicate_person_ids.each do |person_id| - 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) + undesired_profile_ids = [] + duplicate_person_ids.each do |person_id| + 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 + conn.execute("DELETE FROM profiles + WHERE profiles.id IN (#{undesired_profile_ids.join(",")});") unless undesired_profile_ids.empty? end - 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 @@ -29,5 +32,6 @@ class UniqueIndexOnProfile < ActiveRecord::Migration def self.down remove_index :profiles, :person_id + add_index :profiles, :person_id end end