Sha256: e593acc3613c9f63f9f3fae4635e3e9773466726a5370ac18a491fc63b56bdc9

Contents?: true

Size: 1.02 KB

Versions: 2

Compression:

Stored size: 1.02 KB

Contents

class AddUniquePairIndices < Cardio::Migration::Schema
  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
  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.lease_connection
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
card-1.108.1 mod/core/data/schema/20200805200729_add_unique_pair_indices.rb
card-1.108.0 mod/core/data/schema/20200805200729_add_unique_pair_indices.rb