Sha256: e04d99d6563fdf745129970334259c407a954d34181c8eb21cd09cf98861f702

Contents?: true

Size: 1.04 KB

Versions: 11

Compression:

Stored size: 1.04 KB

Contents

class AddUniquePairIndeces < ActiveRecord::Migration[6.0]
  def change
    stash_duplicate_cards
    delete_duplicate_virtuals
    add_index :cards, %i[left_id right_id], unique: true
    add_index :card_virtuals, %i[left_id right_id], unique: true

    drop_table :users
  end

  private

  def stash_duplicate_cards
    fake_id = -9000
    duplicates :cards do |id|
      stash_card id, fake_id
      fake_id = fake_id - 1
    end
  end

  def delete_duplicate_virtuals
    duplicates :card_virtuals do |id|
      connection.execute "delete from card_virtuals where id = #{id}"
    end
  end

  def stash_card id, fake_id
    connection.execute(
      "UPDATE cards set left_id = #{fake_id}, trash = true where id = #{id}"
    )
  end

  def duplicates table
    sql = "SELECT distinct a.id from #{table} a join #{table} b " \
          "ON a.left_id = b.left_id AND a.right_id = b.right_id " \
          "AND a.id < b.id"
    connection.select_all(sql).each { |row| yield row["id"].to_i }
  end

  def connection
    ActiveRecord::Base.connection
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
card-1.104.2 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.104.1 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.104.0 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.103.4 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.103.3 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.103.2 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.103.1 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.103.0 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.101.7 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.102.0 db/migrate/20200805200729_add_unique_pair_indeces.rb
card-1.101.6 db/migrate/20200805200729_add_unique_pair_indeces.rb