Присоедините обратный вызов ассоциации ко всем ассоциациям для данной модели сразу - PullRequest
0 голосов
/ 11 февраля 2020

Предположим, что существует модель учетной записи с несколькими ассоциациями, связанными с таблицей пользователей, например:

class Account < ActiveRecord
  has_many :users
  has_many :clients, ..., :source => :user
  has_many :managers, ..., :source => :user
end

Если я использую .delete() с любой из этих ассоциаций, это приведет к удалению существующих отношений между учетной записью и Пользователь. Я хочу зарегистрировать обратный вызов, когда это отношение будет удалено. Я могу добавить каждое объявление has_many с помощью :before_remove => :callback, но мне интересно, есть ли какой-либо ярлык, который автоматически добавит обратный вызов к каждой существующей ассоциации, где source установлен на :user.

1 Ответ

2 голосов
/ 11 февраля 2020

Нет. Там нет такой опции. Возможно, потому что это не очень хорошая идея, так как это действительно увеличит сложность и вызовет массу нежелательных побочных эффектов.

И это также не нужно, так как вы можете добиться того же, украшая метод:

module MyApp
  module Assocations

    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      def decorate_association(**options, &block)
         yield AssocationDecorator.new(self, options)
      end
    end

    class AssocationDecorator
      attr_accessor :options, :klass
      def initialize(klass, **options)
        @klass = klass
        @options = options
      end
      def has_many(name, scope = nil, **options, &extension)
        @klass.has_many(name, scope, options.reverse_merge(@options), &extension)
      end
    end
  end
end
class Account < ActiveRecord
  include MyApp::Assocations
  decorate_association(before_remove: :callback, source: :user) do |decorator|
    decorator.has_many :clients
  end
end
...