Как я выполняю миграцию, не запуская транзакцию в направляющих?

Я работаю над перекрестным средством просмотра браузера для очень больших исторических планов и scetches. Хорошая справка для первых шагов (старый блог) я нашел в http://www.cadmaps.com/gisblog/?p=7 понимать пирамиды изображений (это - то, какая Google Maps работает с).

С 'tiler' я произвожу много изображений как testImage_0001111100.png. 0001111100 т.е. 5-й уровень масштабирования и x / y положение в пирамиде изображений. Большая часть вычисления (соседние изображения, стек изображений вверх и вниз) является сделанной серверной стороной php, названным запросами ajax.

я борюсь в момент с (весьма разрешимыми) проблемами в гладком смещении и изменении масштаба. Это - моя проблема - но прочитайте статью.

20
задан Helder S Ribeiro 8 September 2009 в 18:50
поделиться

1 ответ

ActiveRecord :: Migration имеет следующий закрытый метод, который вызывается при выполнении миграции:

def ddl_transaction(&block)
  if Base.connection.supports_ddl_transactions?
    Base.transaction { block.call }
  else
    block.call
  end
end

Как вы можете видеть, это завершит миграцию транзакцией, если соединение поддерживает ее.

В ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter у вас есть:

def supports_ddl_transactions?
  true
end

SQLite версии 2.0 и выше также поддерживает транзакции миграции. В ActiveRecord :: ConnectionAdapters :: SQLiteAdapter у вас есть:

def supports_ddl_transactions?
  sqlite_version >= '2.0.0'
end

Итак, чтобы пропустить транзакции, вам нужно как-то обойти это. Что-то вроде этого может сработать, хотя я не тестировал его:

class ActiveRecord::Migration
  class << self
    def no_transaction
      @no_transaction = true
    end

    def no_transaction?
      @no_transaction == true
    end
  end

  private

    def ddl_transaction(&block)
      if Base.connection.supports_ddl_transactions? && !self.class.no_transaction?
        Base.transaction { block.call }
      else
        block.call
      end
    end
end

Затем вы можете настроить миграцию следующим образом:

class SomeMigration < ActiveRecord::Migration
  no_transaction

  def self.up
    # Do something
  end

  def self.down
    # Do something
  end
end
16
ответ дан 29 November 2019 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: