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 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
|
||||
|
|
|
|||
Loading…
Reference in a new issue