我有一个模特:
class MyModel
prepend MyModelOverride
def find_something
#returns something
end
end
module MyModelOverride
included do
def method1
find_something
end
end
end
MyModel.new.method1
最后一次调用会返回以下错误:
NoMethodError: undefined method `method1' for #<MyModel:0x007f089c673b48>
如何正确格式化MyModelOverride中的代码,以便我可以从MyModel的实例中调用其中的方法和我可以从其中调用MyModel的其他方法?
答案 0 :(得分:2)
要通过mixin /模块包含方法,您只需要:
module MyModelOverride
def method1
find_something
end
end
这将使method1
成为您包含它的任何类的实例方法。
您在示例中使用的included
块来自ActiveSupport::Concern。如果您想将ActiveSupport :: Concern用于更高级的包含概念,请将其包含在您的模块中:
module MyModelOverride
extend ActiveSupport::Concern
included do
# macros to run when module is included, like `scope` or `has_many` etc.
end
def method1
find_something
end
end
答案 1 :(得分:1)
我会使用prepended
挂钩: -
module MyModelOverride
def self.prepended(klass)
klass.class_eval do
def method1
find_something
end
end
end
end
class MyModel
prepend MyModelOverride
def find_something
12
end
end
MyModel.new.method1 # => 12