2013-01-31 26 views
0

我有一個類,有一些假的關係,我想要實現:如何創建假has_many關係,並讓每個關係都包含類方法作爲實例方法?

兩種形式
module FormStack 
    class Connection 
     def forms; end 
     def fields; end 
    end 
end 

我已經metaprogramically生成的類和字段(因爲它們是基於REST的資源,它們共享相同的動作名稱,而params) ,並且我想在我的FormStack :: Connection類中將這些方法包含在我的假關係中。這可以做到嗎?

我基本上想要<FromStack::Connection Instance>.forms的行爲就好像它是FormStack::Form,所以我可以做的事情如<connection>.forms.all<connection>.forms.find(id)

這可能嗎? 任何我應該看的最佳實踐? (這對我來說似乎有些奇怪,但我認爲這是一種以有用的方式實現方法的優雅方式,同時仍然具有對Restful資源/對象的ActiveRecord-esque抽象)。

這是我的工作的代碼,如果你想看看:https://github.com/TinderBox/formstack/tree/connection_instances

回答

0

爲什麼不直接使用簡單的成分?當您初始化一個新的FormStack :: Connection實例時,傳遞任何具有該FormStack :: Form關係的對象。然後,您可以直接調用FormStack :: Form集合實例上的#forms方法,也可以使用委派。

FormStack::Connection.new(FormStack::FormCollection.new(params[:form]) #sample class name -- obviously use whatever has the real has_many :forms 

module FormStack 
    class Connection 
    def initialize(form_collection) 
     @form_collection = form_collection 
    end 
    def forms 
     @form_collection.forms 
    end 
    def fields 
     @form_collection.fields 
    end 
    end 
end 

或者

module FormStack 
    class Connection 
    extend Forwardable 
    def_delegators :@form_collection, :forms, :fields 

    def initialize(form_collection) 
     @form_collection = form_collection 
    end 
    end 
end 
+0

這會允許是做' .forms.all'或' forms.find(id)'例如? 'all'和'find'是類方法。 – NullVoxPopuli

+0

窗體實際上不是'FormStack :: Forms'中的方法,請參閱:https://github.com/TinderBox/formstack/blob/connection_instances/lib/formstack/form.rb – NullVoxPopuli

相關問題