Как я могу опустить середину цепочки методов?

Предположим, у меня есть класс с save метод и три миксина, которые модифицируют его с помощью псевдонимов, например

module Callbacks
  def save_with_callbacks
    callback :before_save
    save_without_callbacks
    end
  end

  alias_method_chain :save, :callbacks
end

и аналогично для save_with_transaction а также save_with_timestamps, смешанный в том порядке, так MyModel#save звонки save_with_timestamps, который вызывает save_with_transaction, который вызывает save_with_callbacksкоторый, наконец, называет оригинал save,

Теперь предположим, что я хочу сохранить без транзакции. я могу позвонить save_without_transaction, но это не вызывает код для установки меток времени.

Как я могу сохранить свою модель с метками времени и обратными вызовами, но без транзакции?

Я мог бы переупорядочить миксины, но мой вопрос касается опускания середины, а не конкретно транзакций. Как я могу опустить середину цепочки методов?

ПРИМЕЧАНИЕ. - Для краткости я использовал Roias alias_method_chain, но мой вопрос относится к ruby ​​в целом.

1 ответ

Похоже, ваш единственный вариант - для меня, во всяком случае, - предоставить вторую цепочку вызовов, которая в дальнейшем обрабатывает эту функцию. Я не думаю, что вы можете сделать это с помощью псевдонимов; вам нужно будет определить новый метод, который вместо этого вызовет старый метод - так что-то вроде:

  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.

(Как и в сторону, а не длинные цепочки псевдонимами собирается сделать ваш код очень трудно читать? Лично я думаю, что я бы работать, чтобы избежать их.)

Другие вопросы по тегам