Only run the data migration if there are profiles in the db
This commit is contained in:
parent
c7b4e2b4f4
commit
e22701a12d
1 changed files with 23 additions and 19 deletions
|
|
@ -1,27 +1,30 @@
|
||||||
class UniqueIndexOnProfile < ActiveRecord::Migration
|
class UniqueIndexOnProfile < ActiveRecord::Migration
|
||||||
|
class Profile < ActiveRecord::Base; end
|
||||||
def self.up
|
def self.up
|
||||||
conn = ActiveRecord::Base.connection
|
if Profile.count > 0
|
||||||
columns = conn.columns("profiles").map{|c| c.name}
|
conn = ActiveRecord::Base.connection
|
||||||
["id", "created_at", "updated_at"].each{|n| columns.delete(n)}
|
columns = conn.columns("profiles").map{|c| c.name}
|
||||||
|
["id", "created_at", "updated_at"].each{|n| columns.delete(n)}
|
||||||
|
|
||||||
sql = <<-SQL
|
sql = <<-SQL
|
||||||
SELECT profiles.person_id FROM profiles
|
SELECT profiles.person_id FROM profiles
|
||||||
GROUP BY #{columns.join(',')}
|
GROUP BY #{columns.join(',')}
|
||||||
HAVING COUNT(*)>1 AND profiles.person_id IS NOT NULL;
|
HAVING COUNT(*)>1 AND profiles.person_id IS NOT NULL;
|
||||||
SQL
|
SQL
|
||||||
result = conn.execute(sql)
|
result = conn.execute(sql)
|
||||||
duplicate_person_ids = result.to_a.flatten
|
duplicate_person_ids = result.to_a.flatten
|
||||||
|
|
||||||
undesired_profile_ids = []
|
undesired_profile_ids = []
|
||||||
duplicate_person_ids.each do |person_id|
|
duplicate_person_ids.each do |person_id|
|
||||||
profile_ids = conn.execute("
|
profile_ids = conn.execute("
|
||||||
SELECT profiles.id FROM profiles
|
SELECT profiles.id FROM profiles
|
||||||
WHERE profiles.person_id = #{person_id};").to_a.flatten
|
WHERE profiles.person_id = #{person_id};").to_a.flatten
|
||||||
profile_ids.pop
|
profile_ids.pop
|
||||||
undesired_profile_ids.concat(profile_ids)
|
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
|
end
|
||||||
conn.execute("DELETE FROM profiles
|
|
||||||
WHERE profiles.id IN (#{undesired_profile_ids.join(",")});") unless undesired_profile_ids.empty?
|
|
||||||
|
|
||||||
remove_index :profiles, :person_id
|
remove_index :profiles, :person_id
|
||||||
add_index :profiles, :person_id, :unique => true
|
add_index :profiles, :person_id, :unique => true
|
||||||
|
|
@ -29,5 +32,6 @@ class UniqueIndexOnProfile < ActiveRecord::Migration
|
||||||
|
|
||||||
def self.down
|
def self.down
|
||||||
remove_index :profiles, :person_id
|
remove_index :profiles, :person_id
|
||||||
|
add_index :profiles, :person_id
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue