我有一个类,有一些我想实现的假关系:
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的restful资源/对象的抽象)。
下面是我正在使用的代码,如果你想看的话:https://github.com/TinderBox/formstack/tree/connection_instances
发布于 2013-02-01 05:36:09
除非有更好的方法,否则这就是我目前解决问题的方法:
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发布于 2013-01-31 21:58:30
为什么不直接使用简单的组合呢?在初始化新的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
endhttps://stackoverflow.com/questions/14626686
复制相似问题