我有一个班级,我想实现一些假的关系:
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
答案 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