36 lines
1.2 KiB
Ruby
36 lines
1.2 KiB
Ruby
class GuidIsUnique < ActiveRecord::Migration
|
|
def self.consolidate_post(guid)
|
|
post_ids = execute("select posts.id from posts where posts.guid = '#{guid}'").to_a.flatten!
|
|
keep_id = post_ids.pop
|
|
execute("UPDATE comments
|
|
SET comments.post_id = #{keep_id}
|
|
WHERE comments.post_id IN (#{post_ids.join(',')})")
|
|
|
|
execute("UPDATE posts
|
|
SET posts.status_message_id = #{keep_id}
|
|
WHERE posts.status_message_id IN (#{post_ids.join(',')})")
|
|
|
|
execute("DELETE FROM post_visibilities WHERE post_visibilities.post_id IN (#{post_ids.join(',')})")
|
|
execute("DELETE FROM mentions WHERE mentions.post_id IN (#{post_ids.join(',')})")
|
|
execute("DELETE FROM posts WHERE posts.id IN (#{post_ids.join(',')})")
|
|
end
|
|
def self.up
|
|
sql = <<-SQL
|
|
SELECT posts.guid FROM posts
|
|
GROUP BY posts.guid
|
|
HAVING COUNT(*)>1;
|
|
SQL
|
|
duplicated_guids = execute(sql).to_a.flatten!
|
|
|
|
duplicated_guids.each do |guid|
|
|
consolidate_post(guid)
|
|
end if duplicated_guids
|
|
remove_index :posts, :guid
|
|
add_index :posts, :guid, :unique => true
|
|
end
|
|
|
|
def self.down
|
|
remove_index :posts, :column => :guid
|
|
add_index :posts, :guid
|
|
end
|
|
end
|