The "before" version really doesn't seem that painful. Compared with the cost to the rails team to maintain the syntax, and the cost in understandability to other developers that happen upon your code. DSLs are only helpful when they are well understood by everyone that has to read them - something like this would be very rarely used, so every dev that encounters it in the wild will have to look up what "compose" means, (or try to figure out where published_posts is defined if they dont know the trick is to look at the posts has_many definition) to try and figure out the magic.
I think you're better off being more explicit in these cases.