Rails after_commit? - PullRequest
       9

Rails after_commit?

7 голосов
/ 08 февраля 2010

Кто-нибудь реализовал хук after_commit в Rails? Я не ищу модель на основе после коммитов при обновлении / создании / и т.д., я хочу иметь возможность динамически определять блок, который будет выполняться, только если текущая (самая верхняя) транзакция пройдет:

def remove_file
  current_transaction.after_commit do
    FileUtils.rm(file_path)
  end
end

Есть идеи, если это уже реализовано, будет ли это в рельсах 3.0?

Ответы [ 5 ]

6 голосов
/ 29 июня 2011

Rails 3 предоставляет обратные вызовы after_commit / after_rollback: https://github.com/rails/rails/commit/da840d13da865331297d5287391231b1ed39721b

В Rails 1 и 2 вы можете получить ту же функциональность, используя этот драгоценный камень: https://github.com/freelancing-god/after_commit

3 голосов
/ 13 июля 2010

Это ядро ​​Rails в Rails 3.

Документация здесь: http://edgeapi.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#M001117

2 голосов
/ 08 февраля 2010

Вы не увидите after_commit в Rails 3.0, по крайней мере, пока. Вы можете применить патч и посмотреть, будет ли он одобрен основной командой, но я сомневаюсь, что он будет. Эта функциональность остается гораздо более функциональной вне ядра Rails, в плагине.

Вы можете попробовать этот плагин:

http://github.com/GUI/after_commit

1 голос
/ 08 февраля 2013

Поскольку OP спрашивал о динамической настройке кода, который должен выполняться после совершения транзакции, after_commit не решает его проблему. К счастью, существует after_commit_queue гем, который решает именно эту проблему.

Используя пример OP, код будет выглядеть так:

include AfterCommitQueue

def remove_file
  run_after_commit do
    FileUtils.rm(file_path)
  end
end
1 голос
/ 09 февраля 2010

Я создал легкий плагин after_commit: плагин after_commit который включает следующий синтаксис:

def some_callback
  after_commit do
    # save file, expire cache, etc
  end
end

Это очень легкий, но делает работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...