You want to either use the block form or define your own version of <=> to use, stripping punctuation and downcasing the input for good measure to create a "natural" sort.
Just beware that if you ever end up using a pagination gem (or rolling your own) such that you get a single “page” of results using limit and offset on your back-end database, this’ll screw up any chance of your custom sorting working correctly. If you’ll never be using LIMIT and OFFSET SQL clauses, then this works great!
You have not shown us the code you have used to do the sort so how can
we tell what is wrong with it? Make sure you copy/paste it here
rather than re-type it so we can see exactly what you have done. Just
the code for the sorting please. First make sure you understand the
code you have used. Can you see why it does not do what you want?
If I were you I would add a new column PLAIN_NAME or similar and I
would strip everything out everything you don't want in the name and
then sort by it. I think it would remove the complexity. You can
populate the new column with a before_save callback.