Sure, the inner workings of the system is as you describe, but the approach this article takes does make sense out of a developer standpoint, no? Sure "has_many" is just a method that the late-binding architecture of Ruby allows us to write, but this means that we can dream up our own DSLs and implement our DSL by doing what we do best - write methods ;) Which is a less general approach than the full-blown Lisp macros guns.
Is that right for me as a developer?