Ruby meta-programming uses runtime flexibility to do cool things, but has_many is just a method, like any other method, which is passed arguments (at runtime), and can do super-cool things with them because of the late-binding architecture of Ruby. This a concept originated from Smalltalk. It's super cool.
Lisp macros do something completely different: they let you extend the parser of the language. They literally let you write code that edits your code, at compile time, before anything is run. It's super cool, too, but in a very different way.
Here's a hig-level view:
1) You write code.
2) That code is translated to a data structure which is interpreted by a computer.
Lisp macros are ways of extending what the translation rules are. Ruby, on the other hand, has lots of neat design decisions which let you write code that interprets instructions at runtime in interesting ways. Very different.