Adding methods to Object in Rails -- WARNING

I wanted to do:

foo.wrap

and wrap would go to a specialized wrap for some types of foo and a
general Object#wrap for all the others.

So I added wrap to Object

class Object
def wrap
self
end
end

This worked except for objects which are actually AssociationProxy
objects pretending to be some other object. The reason is that
AssociationProxy removes all but a few methods from itself. You will
find this line at the top of
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb

  instance_methods.each { |m| undef_method m unless m =~

/(^__|^nil?$|^send$|proxy_)/ }

This happens before the files in initializers gets loaded. And that is
where I added Object#wrap. So, for a proxied object, it would call
Object#wrap instead of the specialized wrap that I had defined in my
class.

My solution to this was to do this:

module ActiveRecord
module Associations
class AssociationProxy
undef_method :wrap
undef_method :unwrap
end
end
end

I think Rails could solve this problem by hooking into
Object.method_added. And when methods are added, the hook could undef
them for the proxy class(es). The other choice would be to subclass
AssociationProxy from BlankSlate rather than Object – it appears that
that is what BlankSlate is intended to do.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs