0

我有一堂课,我想实现一些虚假的关系:

module FormStack
   class Connection
      def forms; end
      def fields; end   
   end 
end

我为表单和字段都生成了元编程类(因为它们是 RESTful 资源,它们共享相同的操作名称和参数),并且我想将这些方法包含在我的 FormStack::Connection 类中的假关系中。可以这样做吗?

我本质上想<FromStack::Connection Instance>.forms表现得好像它是一样FormStack::Form,所以我可以做类似<connection>.forms.all或的事情<connection>.forms.find(id)

这可能吗?我应该看的任何最佳实践?(这对我来说似乎有点奇怪,但我认为这是一种以有用的方式实现方法的优雅方式,同时仍然具有静止资源/对象的 ActiveRecord 式抽象)。

这是我正在使用的代码,如果您想查看:https ://github.com/TinderBox/formstack/tree/connection_instances

4

2 回答 2

0

为什么不只使用简单的组合?当您初始化一个新的 FormStack::Connection 实例时,传递任何具有has_manyFormStack::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
于 2013-01-31T13:58:29.810 回答
0

除非有更好的方法,否则这就是我现在解决问题的方法:

def method_missing(meth, *args, &block)
    method_name = meth.to_s

    if "forms" == method_name
        FormStack::Form.connection = self
        FormStack::Form
    elsif ...
    else
        super
    end
end

https://github.com/TinderBox/formstack/blob/082793bed97e97cc65c703c8ca3cb382cbdf743a/lib/formstack/connection.rb

于 2013-01-31T21:36:08.963 回答