ruby-on-rails - 如何在 Rails 模型中创建多个类和实例方法

标签 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 文件夹结构将它放在哪里,甚至不确定是否将模块放入我的模型中。

有什么建议吗?

最佳答案

选项 1 - 扩展 self

如果您希望所有 实例方法也作为类方法,您可以简单地使用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

关于ruby-on-rails - 如何在 Rails 模型中创建多个类和实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16660357/

相关文章:

php - 您将如何映射或合并来自多个源/源的不同数据?

ruby - 将字符串转换为日期对象 Ruby

ruby-on-rails-3 - Rails 3 路由 : Avoiding Deep Nesting

ruby-on-rails - 将 JSON 数据嵌入 YAML 文件

javascript - Rails - 如何在 View 中访问 Google map 实例?

ruby-on-rails - 在 osx 上为 ruby​​ on Rails 项目安装 qrencoder gem

ruby-on-rails - 仅当rails_admin中另一个字段不为空时,如何使字段可编辑

ruby-on-rails - 如何在 Capybara finder 中使用正则表达式?

ruby-on-rails - 用于生成与 Rails 3 beta 兼容的动态/ajax crud 接口(interface)的 Rails 插件?

ruby-on-rails - Rails to_json 响应将日期时间转换为 unixtimestamp