Debajit Adhikary
2014-Nov-14 04:37 UTC
Metaprogramming Q: Calling an external class method on after_save
I have the following classes: class AwardBase class AwardOne < AwardBase class Post < ActiveRecord::Base The Post is an ActiveRecord, and the Award has a can_award? class method which takes a post object and checks to see if it meets some criteria. If yes, it updates post.owner.awards. I know I can do this using an Observer pattern (I tested it and the code works fine). However, that requires me to add additional code to the model. I'd like not to touch the model at all if possible. What I'd like to do is run the Award checks like this (the trigger will be invoked at class load time): class AwardOne < AwardBase trigger :post, :after_save def self.can_award?(post) ... end end The intention with the above code is that it should automatically add AwardOne.can_award? to Post's after_save method So essentially what I'm trying to do is to get the above code to be equivalent to: class Post < ActiveRecord::Base after_save AwardOne.can_award?(self) ... end which is basically: class Post < ActiveRecord::Base after_save :check_award def check_award AwardOne.can_award?(self) end end How can I do this without modifying the Post class? ---------------------------------- Here's what I've done (which does not appear to work): class AwardBase def self.trigger (klass, active_record_event) model_class = klass.to_class this = self model_class.instance_eval do def award_callback this.can_award?(self) end end model_class.class_eval do self.send(active_record_event, :award_callback) end end def self.can_award? (model) raise NotImplementedError end end -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/976a57ed-c4e2-484c-9042-c279c5db70c2%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.