Recently when looking through some plugin’s code, we found the following line:

1self.send(:include, Foo)

This seems to be an acceptable variant of the commonly used

1ActiveRecord::Base.send(:include, Foo)

As you may have surmised, it is not an acceptable variant. This is a Voodoo programming smell, as it indicates a misunderstanding of exactly what the semantics of send are. There is also a clearer, more intention revealing, and identical1 alternative include Foo or with the omitted parenthesis include(Foo) .

This of course, leads us to why ActiveRecord::Base.send(:include, Foo) is acceptable. The include method is private, so the most elegant way to invoke it on another object is by using send; this is possible because send ignores access control allowing us to invoke include directly.

1 Almost, the difference is that send is in the call stack.

blog comments powered by Disqus