如何创建假的has_many关系,并将每个包含类方法作为实例方法?

时间:2013-01-31 13:16:22

标签: ruby gem

我有一个班级,我想实现一些假的关系:

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-esque抽象的restful资源/对象)。

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

2 个答案:

答案 0 :(得分:0)

为什么不使用简单的构图?在初始化新的FormStack :: Connection实例时,传递任何具有has_many 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

答案 1 :(得分: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