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询问如何在类及其实例之间共享方法。