В вашем примере кода не раскрыта часть вашей темы, а именно символы, поэтому часть вопроса осталась без ответа.
Если у вас есть две строки, foo и bar, и обе могут быть либо строкой, либо символом, вы можете проверить равенство с помощью
foo.to_s == bar.to_s
Немного эффективнее пропускать преобразования строк для операндов с известным типом. Так что если foo это всегда строка
foo == bar.to_s
Но повышение эффективности почти наверняка не стоит требовать дополнительной работы от имени абонента.
До выпуска Ruby 2.2 избегайте интернирования неконтролируемых входных строк с целью сравнения (со строками или символами), поскольку символы не являются сборщиком мусора, и поэтому вы можете открыть себя для отказа в обслуживании из-за исчерпания ресурсов. Ограничьте использование символов до значений, которыми вы управляете, т.е. литералов в вашем коде и свойств доверенной конфигурации.
Ruby 2.2 введена сборка мусора символов .