【问题标题】:How can I omit the middle of a chain of methods?我怎样才能省略方法链的中间?
【发布时间】:2011-06-30 10:01:41
【问题描述】:

假设我有一个带有save 方法的类,以及三个使用别名对其进行修改的mixin,例如

module Callbacks
  def save_with_callbacks
    callback :before_save
    save_without_callbacks
    end
  end

  alias_method_chain :save, :callbacks
end

对于save_with_transactionsave_with_timestamps 也是如此,按此顺序混合,所以MyModel#save 调用save_with_timestamps,后者调用save_with_transaction,后者调用save_with_callbacks,最终调用原始save

现在假设我想在没有交易的情况下保存。我可以调用save_without_transaction,但这不会调用代码来设置时间戳。

如何保存带有时间戳和回调但没有事务的模型?

我可以重新排序 mixins,但我的问题是省略中间,而不是专门的交易。如何省略方法链的中间部分?

注意 - 为了简洁起见,我使用了 RoR 的 alias_method_chain,但我的问题一般适用于 ruby​​

【问题讨论】:

    标签: ruby alias-method-chain


    【解决方案1】:

    您唯一的选择似乎是——无论如何,对我来说——提供第二个调用链来进一步处理这个功能。我不认为你可以用别名来做到这一点。您将不得不定义一个调用旧方法的新方法,而不是 - 类似于:

    1. MyModel#save
    2. MyModel#save_other

    (顺便说一句,长长的别名链不会让你的代码很难阅读吗?我个人认为我会努力避免它们。)

    【讨论】:

    • 是的,它们有时确实难以阅读,但 Rails 代码库大量使用它们。
    • 好吧,正如我妈妈所说,“如果 Rails 代码库从悬崖上跳下来,你也会这样做吗?” ...好吧,她实际上不会这么说... :)
    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2012-10-12
    • 2014-08-13
    • 2011-07-18
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多