如何省略方法链的中间部分?

时间:2011-06-30 10:01:41

标签: ruby alias-method-chain

假设我有一个带有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,调用{{1} }},最终调用原始save_with_callbacks

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

如何使用时间戳和回调保存模型,但没有事务?

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. MyModel#save< -save_with_timestamps< - save_with_transaction< - save_with_callbacks< -save。
  2. MyModel#save_other< -save_with_timestamps_other< - save_with_callbacks_other< -save_other。
  3. (顺便说一句,不是很长的别名链会让你的代码很难阅读吗?我个人认为我会努力避免它们。)