1

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

module Callbacks
  def save_with_callbacks
    callback :before_save
    save_without_callbacks
    end
  end

  alias_method_chain :save, :callbacks
end

同样对于save_with_transactionand save_with_timestamps,按此顺序混合, soMyModel#save调用save_with_timestamps,调用save_with_transaction,调用save_with_callbacks,最后调用 original save

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

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

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

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

4

1 回答 1

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。

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

于 2011-06-30T10:44:39.593 回答