2011-12-30 8 views
0

含まれるモジュールに応じて、Rubyでクラスを初期化する最良の方法は何か疑問があります。例を挙げましょう:と::geolocalisableモジュールを含む各クラスのUSER_LOCATION変数含まれるモジュールに応じてRubyクラスを初期化する

class BaseSearch 
    def initialize query, options 
     @page = options[:page] 
     #... 
    end 
end 


class EventSearch < BaseSearch 
    include Search::Geolocalisable 

    def initialize query, options 
    end 
end 

class GroupSearch < BaseSearch 
    include Search::Geolocalisable 

    def initialize query, options 
    end 
end 

module Search::Geolocalisable 
    extend ActiveSupport::Concern 

    included do 
     attr_accessor :where, :user_location #... 
    end 
end 

私はしたくない何を、初期化するために持っています。

現在、私はちょうど私のモジュール内のdef geolocalisable?; true; endのようなメソッドを定義し、その後、私は、基本クラスで(モジュールによって追加された)これらの属性を初期化します。

class BaseSearch 
    def initialize query, options 
     @page = options[:page] 
     #... 
     if geolocalisable? 
      @where = query[:where] 
     end 
    end 
end 

class EventSearch < BaseSearch 
    #... 
    def initialize query, options 
     #... 
     super query, options 
    end 
end 

があり、より良いソリューションですか?そうだといい!

答えて

3

モジュールでinitializeを上書きしないのはなぜ?あなたは明らかに、これは

+0

私はしようとしますが、ActiveSupportを使用する場合、 :懸念?この場合、私はあなたの例のように、含まれているモジュールがほぼスーパークラスとして機能しているとは思わなかった。 – Robin

+0

それで、まったく同じように動作し、あなたのソリューションは私が探していたものでした。ありがとうございました。検索中に覚えたランダムなこと: 'super()'を呼び出すことは 'super'とは異なります。論理的ですがまだ^^。 – Robin

0

は、このコードを参照してください:

module Search::Geolocalisable 
    def self.included(base) 
    base.class_eval do 
     attr_accessor :where, :user_location #... 
    end 
    end 
end 

class EventSearch < BaseSearch 
    include Search::Geolocalisable 
end 
+0

問題はアクセサを追加することに関するものではありませんが起こるかもしれない同様の署名や奇妙なもので、初期化を持っているあなたのモジュールが含まれ、すべてを必要としない

class BaseSearch def initialize query puts "base initialize" end end module Geo def initialize query super puts "module initialize" end end class Subclass < BaseSearch include Geo def initialize query super puts "subclass initialize" end end Subclass.new('foo') #=> base initialize module initialize subclass initialize 

を行うことができます。 ActiveSupport :: Concernおよび 'included do;終わりはそれを世話する。モジュールが含まれているすべてのクラスで初期化するための良い方法を見つけることです:) – Robin

+0

oups、申し訳ありませんが、私はあまりにも速く読んだ=/ – thoferon

関連する問題