Witam, to mój pierwszy post na tym forum więc proszę o wyrozumiałość.
Tworząc pewnego plugina do activerecord, stanąłem przed problemem blokady zapisu rekordu - innymi słowy nie wykonywanie record.save, jednak chciałbym aby wszystkie metody before_save i after_save były wykonywane.
Obecnie próbuje tak:
define_method(:save) do
v_callback(self.class.before_save) unless self.before_save.nil?
save.bind(self).call unless save_lock
v_callback(self.class.after_save) unless self.after_save.nil?
end
def v_callback(obj)
obj.each { |callback|
#puts 'metoda na gloda: '+callback.method.to_s
v_callback(self.class.after_save) unless self.after_save.nil?
}
end
(…)[/code]
jednak mimo to metody nie są wywoływane. Jak łatwo zauważyć przy save_lock=true ma zrobić wszystko (w tym także obsłużyć wszelkie relacje) poza zapisem (aktulizacją) tego rekordu do bazy.
Edit:
rozwiazanie
zamiast
v_callback(self.class.after_save) unless self.after_save.nil?
musiałem wstawić blok:
[code]self.class.after_save.each { |callback|
(callback.options.empty?)? callback.call(self) : callback.call(self, callback.options)
}[/code]
na callbacku wystarczyło wywołać callback.call(self) bądź callback.call(self, callback.options)
Przepraszam za zamieszanie 