Rails:将方法附加到activerecord(正确的方法?)

时间:2012-03-30 11:48:45

标签: ruby-on-rails ruby activerecord

我正在搞乱创建rails gem而且我在向ActiveRecord添加方法时遇到了麻烦。假设我想做以下事情:

class DemoModel < ActiveRecord::Base
  custom_method :first_argument, :second_argument
end

为了使这项工作,我提出以下内容:

module DemoMethod

  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods       
    def custom_method(*fields)
      @my_fields = fields
    end
  end

end

ActiveRecord::Base.send(:include, DemoMethod)

到目前为止,非常好。

问题是,我想从模型实例访问my_fields变量。例如,我可能用以下内容打开form_for:

module ActionView::Helpers::FormHelper
  def fields_for(record_name, record_object, options = {}, &block)
    the_fields = record_object.<I WANNA ACCESS @my_fields HERE!!!>.html_safe
    # ...
  end
end

难点在于,'custom_method'似乎只有在我将帮助器设置为类方法时才有效,但这意味着.self现在是Model(DemoModel)而不是我想要工作的DemoModel对象。我可以使用“custom_method self,:first_argument,:second_argument”手动传递对象,但是让我的精彩“custom_method”gem的用户必须将“self”添加到他们的参数列表中似乎有点笨拙。 / p>

所以,问题是,一个更聪明的Rails人如何通过custom_method为特定对象设置值,然后在其他地方检索它们,比如fields_for?

一如既往,任何建议都值得赞赏。

1 个答案:

答案 0 :(得分:2)

使用self.includedClassMethods将方法添加为类方法。

通常在模块中定义方法,然后包含它们,是创建普通实例方法的方法。像这样:

module DemoMethod

   def custom_method(*fields)
    @my_fields = fields
  end
end

ActiveRecord::Base.send(:include, DemoMethod)