On Thursday, 13 November 2014 23:37:40 UTC-5, Debajit Adhikary wrote:
>
> 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
>
>
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).
--Matt Jones
> class Post < ActiveRecord::Base
> after_save :check_award
>
> def check_award
> AwardOne.can_award?(self)
> 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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rubyonrails-talk/59592b58-9f3f-4374-b37a-c6cea7372735%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.