2012-07-18 3 views
0

Если у меня есть классы, как это,класс на модули ActiveRecord

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 на ссылки, включая этот модуль в любой из этих классов? Я задаю этот вопрос, потому что хотел сделать что-то вроде добавления has_one: association или after_create: do_something в класс A или B с помощью примера ExampleModule, например, ниже.

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 

Есть ли лучший способ сделать это? Благодаря!

ответ

1

Если продлить ActiveSupport::Concern, вы должны быть в состоянии сделать это, когда модуль included:

module ExampleModule 

    extend ActiveSupport::Concern 

    def do_something 
    # ... 
    end 

    included do 
    has_one :association 
    after_create :do_something  
    end 
end 
+0

Я ожидал чего-то другого, но ваш ответ был лучше, чем мое ожидание. Благодаря! – RubyFanatic

+0

Поддерживает ли ActiveSupport :: Concern также и контроллеры? Как добавить before_filter и т. Д.? – RubyFanatic

+1

Я предполагаю, что это возможно, но я только использовал «Концерн» с моделями. (проверка документации) ... на самом деле, похоже, что это будет честная игра (см. http://www.fakingfantastic.com/2010/09/20/concerning-yourself-with-active-support-concern/) – rjz

1

Если вы, желая сделать вызов has_one или after_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 
Смежные вопросы