Su muestra de código no se expandió en parte de su tema, es decir, los símbolos, por lo que parte de la pregunta quedó sin respuesta.
Si tiene dos cadenas, foo y bar, y ambas pueden ser una cadena o un símbolo, puede probar la igualdad con
foo.to_s == bar.to_s
Es un poco más eficiente omitir las conversiones de cadenas en operandos con tipo conocido. Entonces, si foo es siempre una cadena
foo == bar.to_s
Pero es casi seguro que la ganancia de eficiencia no vale la pena exigir ningún trabajo adicional en nombre de la persona que llama.
Antes de Ruby 2.2, evite internar cadenas de entrada no controladas con el propósito de comparar (con cadenas o símbolos), porque los símbolos no se recolectan como basura, por lo que puede abrirse a la denegación de servicio a través del agotamiento de los recursos. Limite el uso de símbolos a los valores que controla, es decir, literales en su código y propiedades de configuración confiables.
Ruby 2.2 introdujo la recolección de basura de símbolos .
foo.intern == bar.intern
Sería mejor: intercalar una cadena es más eficiente en promedio que crear una cadena a partir de un símbolo. (Si una cadena dada ha sido internada previamente, simplemente devuelve el símbolo)