Ruby on rails 一次将关联回调附加到给定模型的所有关联

Ruby on rails 一次将关联回调附加到给定模型的所有关联,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,假设有一个帐户模型与一个用户表有多个关联,例如: class帐户:用户 有许多:经理,…,:来源=>:用户 结束 如果我将.delete()与这些关联中的任何一个一起使用,它将删除帐户和用户之间的现有关系。我想在删除此关系时注册回调。我可以用:before\u remove=>:callback附加每个has\u many声明,但我想知道是否有任何快捷方式可以自动将回调添加到源设置为:user否的每个现有关联中。没有这样的选项。可能是因为这不是一个好主意,因为它确实会增加复杂性并导致大量不良副

假设有一个帐户模型与一个用户表有多个关联,例如:

class帐户:用户
有许多:经理,…,:来源=>:用户
结束

如果我将
.delete()
与这些关联中的任何一个一起使用,它将删除帐户和用户之间的现有关系。我想在删除此关系时注册回调。我可以用
:before\u remove=>:callback
附加每个has\u many声明,但我想知道是否有任何快捷方式可以自动将回调添加到源设置为
:user

否的每个现有关联中。没有这样的选项。可能是因为这不是一个好主意,因为它确实会增加复杂性并导致大量不良副作用

而且它也不需要,因为您可以通过装饰方法来实现同样的效果:

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帐户
否。没有此选项。可能是因为这不是一个好主意,因为它确实会增加复杂性并导致大量不良副作用

而且它也不需要,因为您可以通过装饰方法来实现同样的效果:

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帐户
你是否尝试将回调添加到
has-many:users
并检查它是否对所有人都有效?@feifeizhong是的,我尝试了-不起作用你是否尝试将回调添加到
has-many:users
并检查它是否对所有人都有效?@feifeizhong是的,我尝试了-不起作用谢谢你,我最后做了类似的事情谢谢你,最后我做了类似的事情