gpt4 book ai didi

ruby-on-rails - 如何覆盖 gem 添加到 ActiveRecord::Base 的类方法(在我的装饰器中)

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:37 24 4
gpt4 key购买 nike

这里的交互有点复杂,所以请耐心等待。我正在与 Spree 合作。 Spree 在其某些模型中使用了 delegate_belongs_to,包括“Spree::Variant”。 'delegate_belongs_to :product, :available_on (...)' 在原始类主体中被调用。

我希望变体能够有自己的 available_on 日期。 delegate_belongs_to 像这样注入(inject)自己:

module DelegateBelongsTo
extend ActiveSupport::Concern
module ClassMethods
#...
def delegate_belongs_to(association, *attrs)
#...
end
end
end

ActiveRecord::Base.send :include, DelegateBelongsTo

我不想覆盖整个变体类来删除这个参数。这是我最近的尝试之一:

Spree::Variant.class_eval do
class << self
alias_method :original_dbt, :delegate_belongs_to

def delegate_belongs_to(association, *attrs)
attrs.delete [:available_on]
original_dbt(association, attrs)
end
end

attr_accessible :available_on
#...
end

我已经尝试了很多变体。我不确定是不是因为它在 class_eval 中,执行顺序是否有问题,或者是什么,但我似乎无法覆盖此方法。我在这里不明白什么?

谢谢。

最佳答案

这不是真正的答案,我只是指出我尝试过的东西

我不确定这会有多大帮助,但我使用了您的代码并对其进行了一些简化,以查看覆盖该方法是否有效并且确实有效,这意味着您的方法是正确的,如果您直接覆盖该类,那么它将调用新方法。

module DelegateBelongsTo

module ClassMethods
def delegate_belongs_to(association, *attrs)
p "METHOD INSIDE MODULE"
end
end

def self.included(base)
base.extend(ClassMethods)
end
end

module Spree
class Variant
include DelegateBelongsTo

def self.some_method
delegate_belongs_to("foo", "bar")
end
end
end

Spree::Variant.some_method #METHOD INSIDE MODULE


Spree::Variant.class_eval do
class << self
alias_method :original_dbt, :delegate_belongs_to
def delegate_belongs_to(association, *attrs)
p "OVERWRITTEN METHOD"
original_dbt(association, *attrs)
end
end
end

Spree::Variant.some_method # "OVERWRITTEN METHOD", "METHOD INSIDE MODULE"

关于ruby-on-rails - 如何覆盖 gem 添加到 ActiveRecord::Base 的类方法(在我的装饰器中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11568813/

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