Как я могу опустить середину цепочки методов? - PullRequest
1 голос
/ 30 июня 2011

Предположим, у меня есть класс с методом 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 Ответ

2 голосов
/ 30 июня 2011

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

  1. MyModel # save <-save_with_timestamps <- save_with_transaction <- save_with_callbacks <-save. </li>
  2. MyModel # save_other <-save_with_timestamps_other <- save_with_callbacks_other <-save_other. </li>

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

...