Как я могу опустить середину цепочки методов?
Предположим, у меня есть класс с 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 ответ
Похоже, ваш единственный вариант - для меня, во всяком случае, - предоставить вторую цепочку вызовов, которая в дальнейшем обрабатывает эту функцию. Я не думаю, что вы можете сделать это с помощью псевдонимов; вам нужно будет определить новый метод, который вместо этого вызовет старый метод - так что-то вроде:
- MyModel # save <-save_with_timestamps <- save_with_transaction <- save_with_callbacks <-save.
- MyModel # save_other <-save_with_timestamps_other <- save_with_callbacks_other <-save_other.
(Как и в сторону, а не длинные цепочки псевдонимами собирается сделать ваш код очень трудно читать? Лично я думаю, что я бы работать, чтобы избежать их.)