ruby on rails - rails - Conversión de cadena de snake_case a CamelCase en Ruby
ruby on rails tutorial (8)
Benchmark para soluciones de Ruby puro
Tomé todas las posibilidades que tenía en mente para hacerlo con código de rubí puro, aquí están:
capitalizar y gsub
"app_user".capitalize.gsub(/_(/w)/){$1.upcase}
dividir y mapa usando
&
taquigrafía (gracias a la respuesta del usuario3869936)"app_user".split(''_'').map(&:capitalize).join
división y mapa (gracias a la respuesta del Sr. Black)
"app_user".split(''_'').map{|e| e.capitalize}.join
Y aquí está el punto de referencia para todos estos, podemos ver que gsub es bastante malo para esto. Usé 126 080 palabras.
user system total real
capitalize and gsub : 0.360000 0.000000 0.360000 ( 0.357472)
split and map, with &: 0.190000 0.000000 0.190000 ( 0.189493)
split and map : 0.170000 0.000000 0.170000 ( 0.171859)
Estoy tratando de convertir un nombre de serpiente en camello. ¿Hay algún método incorporado?
Por ejemplo: "app_user"
a "AppUser"
(Tengo una cadena "app_user"
Quiero convertir eso al AppUser
modelo).
¿Que tal este?
"hello_world".split(''_'').collect(&:capitalize).join #=> "HelloWorld"
Se encuentra en los comentarios aquí: Clasificar una cadena de Ruby
Ver el comentario de Wayne Conrad
Fuente: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method
Para el propósito de aprendizaje:
class String
def camel_case
return self if self !~ /_/ && self =~ /[A-Z]+.*/
split(''_'').map{|e| e.capitalize}.join
end
end
"foo_bar".camel_case #=> "FooBar"
Y para la variante lowerCase:
class String
def camel_case_lower
self.split(''_'').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
end
end
"foo_bar".camel_case_lower #=> "fooBar"
La mayoría de los otros métodos enumerados aquí son específicos de Rails. Si quieres hacer esto con Ruby puro, la siguiente es la forma más concisa que he encontrado (gracias a @ ulysse-bn por la mejora sugerida)
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(/w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
Llegué aquí buscando el inverso de tu pregunta, pasando de la caja de camello al caso de la serpiente. Use un underscore para eso (no decamelize):
AppUser.name.underscore # => "app_user"
o, si ya tienes una cadena de camello:
"AppUser".underscore # => "app_user"
o, si desea obtener el nombre de la tabla, que es probablemente la razón por la que desea el caso de la serpiente:
AppUser.name.tableize # => "app_users"
Me siento un poco incómodo para agregar más respuestas aquí. Decidió optar por el enfoque ruby puro más legible y mínimo, sin tener en cuenta el buen punto de referencia de @ ulysse-bn. Mientras :class
modo de :class
es una copia de @ user3869936, el modo de :method
no aparece en ninguna otra respuesta aquí.
def snake_to_camel_case(str, mode: :class)
case mode
when :class
str.split(''_'').map(&:capitalize).join
when :method
str.split(''_'').inject { |m, p| m + p.capitalize }
else
raise "unknown mode #{mode.inspect}"
end
end
El resultado es:
[28] pry(main)> snake_to_camel_case("asd_dsa_fds", mode: :class)
=> "AsdDsaFds"
[29] pry(main)> snake_to_camel_case("asd_dsa_fds", mode: :method)
=> "asdDsaFds"
Si está utilizando Rails, String#camelize es lo que está buscando.
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
Si desea obtener una clase real, debe usar String#constantize además de eso.
"app_user".camelize.constantize
Usa classify
Maneja bien las cajas de borde.
"app_user".classify # => AppUser
"user_links".classify # => UserLink
Nota:
Esta respuesta es específica a la descripción dada en la pregunta (no es específica del título de la pregunta). Si uno trata de convertir una cuerda en camel-case, debería usar la respuesta de Sergio . El interlocutor declara que quiere convertir app_user
en AppUser
(no App_user
), de ahí esta respuesta.