我有一个ActiveSupport::关注点模块,大致如下所示:
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!创建的ActiveRecord::Enum.enum和accepted!方法。
问题是,这不起作用,因为当我调用@model.declined!时,它只是调用declined!的原始实现,而忽略了我的自定义方法。
看起来,在运行包含的块之前,我的自定义方法被包含在调用类中--这意味着我的自定义方法正在被enum定义的方法覆盖,而不是反过来。
在这种特殊情况下,有一些简单的解决办法(例如,我可以将调用enum移回包含类,并确保它高于include MyModel::Acceptance,但我想知道是否有一种方法可以解决这个问题,同时将其保持在同一个模块中。
有什么方法可以在included中调用类方法来定义实例方法,然后从同一个Concern模块中重写该实例方法吗?
发布于 2015-02-27 00:44:13
我想你是在找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
endhttps://stackoverflow.com/questions/28214874
复制相似问题