gpt4 book ai didi

ruby-on-rails - 覆盖由同一模块中的类方法定义的 ActiveSupport::Concern 模块中的方法

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:44 25 4
gpt4 key购买 nike

我有一个 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。基本上,我用一些额外的自定义逻辑覆盖了 ActiveRecord::Enum.enum 创建的 declined!accepted! 方法我自己的。

问题是,这行不通,因为当我调用 @model.declined! 时,它只是调用了 declined! 的原始实现,而忽略了我的自定义方法.

看起来我的自定义方法被包含到调用类中 之前 包含的 block 正在运行 - 这意味着我的自定义方法被 enum 定义的方法覆盖,而不是相反。

在这种特殊情况下有一些简单的解决方法(例如,我可以将调用 enum 移回包含类并确保它位于 include MyModel::Acceptance 行之上,但我想知道是否有一种方法可以解决这个问题,同时将其全部保存在同一个模块中。

有什么方法可以在 included 中调用定义实例方法的类方法,然后从同一 Concern 模块中覆盖该实例方法?

最佳答案

我认为您正在寻找 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

关于ruby-on-rails - 覆盖由同一模块中的类方法定义的 ActiveSupport::Concern 模块中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28214874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com