Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails模型中创建几个类和实例方法_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 3.2_Rails Activerecord - Fatal编程技术网

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

Ruby on rails 如何在Rails模型中创建几个类和实例方法,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.2,rails-activerecord,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 class NewClass include SharedMethods ... end 但我不确定根据Rails文件夹结构将其放在哪里,甚至不确定是否将模块放在我的模型中 有什么建议吗?如果您想创建一个

我正在这样做

def self.a
  ...
end

def a
  class.a
end
但对于一些方法,我必须复制实例方法

我在模块中思考

module A
  def a; end
end
然后在我的模型中使用它,如下所示:

extend A
include A
class NewClass
  include SharedMethods

  ...

end
但我不确定根据Rails文件夹结构将其放在哪里,甚至不确定是否将模块放在我的模型中


有什么建议吗?

如果您想创建一个模块,比如
shared_methods.rb
,您应该将文件放在
/lib
目录中

您将包括如下模块:

extend A
include A
class NewClass
  include SharedMethods

  ...

end
选项1-扩展自我 如果您想将所有实例方法也作为类方法,只需使用
extend self

class A
  def foo
    ...
  end

  def bar
    ...
  end

  extend self
end
这将允许您将foo称为
A.foo
A.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
详情请参见此处:


为什么不覆盖相关模型的
方法\u missing
?嗯,我不明白,可以,你能举个例子吗?我知道委托方法,但不明白在这里如何有用。@juanpastas我添加了一个如何使用委托的例子。这个例子说明了如何在两个类之间共享方法,但是OP询问如何在类及其实例之间共享方法。