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?
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
You could do this with code like (not tested):
class AwardOne < AwardBase
def self.trigger(klass, callback, method)
us = self # this may not be needed
klass.to_s.camelize.constantize.send(callback) do |record|
us.send(method, record)
end
end
trigger :post, :after_save, :can_award?
end
But seriously, DON’T DO THIS. Callbacks are already one of the more confusing features of AR, and confounding that by over-metaprogramming is going to obscure things further.
Even re-opening the Post class in award_one.rb and adding the callback in the standard style would be clearer than this, but I’d recommend just using the version you’ve already written (below).