Use raw sql
This commit is contained in:
parent
def20a4d31
commit
1b6ae9406e
1 changed files with 10 additions and 6 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue