如何在Rails模型中创建几个类和实例方法

时间:2013-05-21 00:36:06

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 rails-activerecord

我这样做

def self.a
  ...
end

def a
  class.a
end

但是对于几种方法,我必须复制实例方法。

我正在考虑一个模块

module A
  def a; end
end

然后在我的模型中使用它:

extend A
include A

但我不确定在Rails文件夹结构中放置它,或者甚至将模块放入我的模型中。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

选项1 - 扩展自我

如果您希望将实例方法的 所有 作为类方法,则只需使用extend self

class A
  def foo
    ...
  end

  def bar
    ...
  end

  extend self
end

这样您就可以将foo称为A.fooA.new.foo

选项2 - 包含模块

如果您只希望实例方法的 某些 作为类方法使用,那么您应该按照建议创建一个模块。您可以将该模块放在lib/文件夹中,或者要求它或将lib添加到自动加载路径。

您也可以直接在课程中包含模块,如下所示:

class A
  def not_shared
    ...
  end

  module SharedMethods
    def foo
      ...
    end

    def bar
      ...
    end
  end

  extend  SharedMethods
  include SharedMethods
end

选项3 - 代表

如果您正在使用Rails(或仅使用ActiveSupport),您还可以使用它添加到类/模块的delegate方法。

class A
  def not_shared
    ...
  end

  def foo
    ...
  end

  def bar
    ...
  end

  delegate :foo, :bar, to: 'self.class'
end

详情请见此处:

http://rdoc.info/docs/rails/3.0.0/Module:delegate

答案 1 :(得分:2)

您要创建一个模块,例如shared_methods.rb,您将该文件放在/lib目录中。

您可以包含以下模块:

class NewClass
  include SharedMethods

  ...

end