2011-12-30 64 views
0

我想知道什麼是根據包含的模塊初始化ruby中的類的最佳方法。我給大家舉一個例子:根據包含的模塊初始化一個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 

我不想要什麼,是有初始化:其中和:這包括geolocalisable模塊上的每個類USER_LOCATION變量。

目前,我只是定義就像在我的模塊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?你可以做

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 

顯然,這確實需要的一切,包括你的模塊有一個類似的簽名或怪異的東西的初始化可能發生

+0

我會嘗試,但是你知道它是否以同樣的方式使用ActiveSupport時: :關心?在這種情況下,我並不認爲所包含的模塊幾乎像您的示例中那樣充當超類。 – Robin 2011-12-30 22:35:59

+0

好吧,它的工作原理完全相同,而且您的解決方案是我一直在尋找的,謝謝。我在搜索時學到的隨機事物:調用'super()'與'super'不同。邏輯但仍然^^。 – Robin 2011-12-30 23:09:14

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

的問題是不是添加存取。 ActiveSupport ::關注和'包含做;結束'照顧。這是關於找到一個好的方式來初始化他們在模塊包括在每個類中:) – Robin 2011-12-30 19:37:14

+0

oups,對不起,我讀過太快=/ – thoferon 2011-12-31 00:10:29