Пропуск обратных вызовов при записи создания - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть модель A с after_commit обратным вызовом на create и update.

class A < ApplicationRecord
  after_commit :update_xyz, on: [:create, :update]
end

В этом случае используется задача rake. Моя задача rake пытается создать несколько записей модели A, но мне нужно пропустить этот update_xyz обратный вызов.

Можно ли пропустить эти обратные вызовы при создании записей? Я бы предпочел не добавлять дополнительные гемы / плагины для этого.

Ответы [ 4 ]

0 голосов
/ 07 сентября 2018

Вы можете сделать это так:

namespace :your_namespace do
  task :your_task => :environment do
    A.skip_callback(:commit, :after, :update_xyz)
    //do everything you need
    A.set_callback(:commit, :after, :update_xyz)
  end
end

Для получения дополнительной информации вы можете проверить эту ссылку .

0 голосов
/ 06 сентября 2018

Вы можете добавить условие к вашему обратному вызову , например, например:

class A < ApplicationRecord
  after_commit :update_xyz, on: [:create, :update], unless :rake_task?
end

и определить rake_task? в каком-то подходящем месте.

0 голосов
/ 06 сентября 2018

Я нашел гораздо лучшее решение после небольшого исследования

https://www.rubydoc.info/github/zdennis/activerecord-import/ActiveRecord%2FBase.import

users = [User.new(name: "Test1"), ....]

User.import(users)

Не вызывает обратных вызовов или проверок, и намного быстрее, когда намеревается создать n записей

0 голосов
/ 06 сентября 2018

Если вы хотите, чтобы обычно выполнялся обратный вызов, но в определенное время можно было его пропустить, я обычно использую этот шаблон:

class User < ActiveRecord::Base
  attr_accessor :skip_do_something

  after_save :do_something

  private

    def do_something
      return if skip_do_something
      # do work here
    end
end

Таким образом, он обычно всегда запускает обратный вызов do_something, но его можно пропустить, выполнив:

user = User.find 1
user.skip_do_something = true
user.save

Надеюсь, это поможет.

...