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.

Reply via email to