首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建假的has_many关系,并让每个关系都包含类方法作为实例方法?

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

Stack Overflow用户
提问于 2013-01-31 21:16:22
回答 2查看 83关注 0票数 0

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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-01 05:36:09

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

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2013-01-31 21:58:30

为什么不直接使用简单的组合呢?在初始化新的FormStack::Connection实例时,传入具有has_many FormStack::Form关系的任何对象。然后,您可以直接在FormStack::Form集合实例上调用#forms方法,也可以使用委托。

代码语言:javascript
复制
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

代码语言:javascript
复制
module FormStack
  class Connection
    extend Forwardable
    def_delegators :@form_collection, :forms, :fields

    def initialize(form_collection)
      @form_collection = form_collection
    end
  end 
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14626686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档