我有一个 ActiveSupport::Concern 模块,大致如下所示:
module MyModel
module Acceptance
extend ActiveSupport::Concern
included do
enum status: [:declined, :accepted]
end
def declined!
self.status = :declined
# some extra logic
self.save!
end
def accepted!
self.status = :accepted
# some extra logic
self.save!
end
end
end
这只会包含在 ActiveRecord 类中,因此使用enum
。基本上,我重写了declined!
and accepted!
由创建的方法ActiveRecord::Enum.enum
还有一些我自己的额外的自定义逻辑。
问题是,这不起作用,因为当我打电话时@model.declined!
它只是调用原始实现declined!
并忽略我的自定义方法。
看起来我的自定义方法已包含在调用类中before包含的块正在运行 - 这意味着我的自定义方法正在被定义的方法覆盖enum
,而不是相反。
在这种特殊情况下有一些简单的解决方法(例如,我可以将呼叫移至enum
回到包含类并确保它在线上方include MyModel::Acceptance
,但我想知道是否有一种方法可以解决这个问题,同时将其全部保留在同一个模块中。
有什么方法可以调用其中的类方法included
定义一个实例方法,然后从同一个实例中覆盖该实例方法Concern
module?
我想你正在寻找define_method
.
module MyModel
module Acceptance
extend ActiveSupport::Concern
included do
enum status: [:declined, :accepted]
define_method :declined! do
self.status = :declined
# some extra logic
self.save!
end
define_method :accepted! do
self.status = :accepted
# some extra logic
self.save!
end
end
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)