0

このようなクラスがある場合、

class A < ActiveRecord::Base
  include ExampleModule
end

class B < ActiveRecord::Base
  include ExampleModule
end

module ExampleModule
  module ClassMethods
    ...
  end      

  def included(base)
    ...
  end
end

このモジュールをこれらのクラスのいずれかに含めることを参照するときに、ExampleModule内のクラスAまたはBへの参照を取得するにはどうすればよいですか?以下のようなExampleModuleを含めることで、クラスAまたはBにhas_one:associationまたはafter_create:do_somethingを追加するようなことをしたかったので、この質問をしています。

class A < ActiveRecord::Base
  include ExampleModule
end

class B < ActiveRecord::Base
  include ExampleModule
end

module ExampleModule
  has_one :association
  after_create :do_something      

  module ClassMethods
    ...
  end      

  def included(base)
    ...
  end
end

これを行うためのより良い方法もありますか?ありがとう!

4

2 に答える 2

1

を拡張すると、モジュールが次ActiveSupport::Concernの場合に実行できるはずです。included

module ExampleModule

  extend ActiveSupport::Concern

  def do_something
    # ...
  end

  included do
    has_one :association
    after_create :do_something      
  end
end
于 2012-07-18T00:22:58.313 に答える
1

あなたがしたいのが電話であるhas_oneafter_create、どのクラスがモジュールを含んでいるかに応じて、あなたはこれをすることができます

module Extender
  def self.included(base)
    if base.name == A.name
       # do stuff for A
       has_one :association
    elsif base.name == B.name
       # do stuff for B
       after_create :do_something
    end
  end
end
于 2012-07-24T12:08:03.893 に答える