Saya mencoba mengubah nama dari case ular ke case unta. Apakah ada metode bawaan?
Misalnya: "app_user"
untuk"AppUser"
(Saya punya string yang "app_user"
ingin saya konversi menjadi model AppUser
).
ruby-on-rails
ruby
string
Lohith MV
sumber
sumber
ruby-on-rails
, jadi, saya kira, itu tidak masalah. Tapi terima kasih sudah menyebutkan.#classify
sebagai gantinya."some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"
sudah cukup, menyediakan Rails sudah diinstal.Bagaimana dengan yang ini?
Ditemukan dalam komentar di sini: Klasifikasi string Ruby
Lihat komentar Wayne Conrad
sumber
Jika Anda menggunakan Rails, Gunakan
classify
. Ini menangani kasus tepi dengan baik.catatan:
Jawaban ini khusus untuk uraian yang diberikan dalam pertanyaan (tidak spesifik untuk judul pertanyaan). Jika seseorang mencoba mengkonversi string ke camel-case, mereka harus menggunakan jawaban Sergio . Penanya menyatakan bahwa ia ingin mengkonversi
app_user
keAppUser
(tidakApp_user
), maka jawaban ini ..sumber
classify
mengembalikan string, Anda harus memanggilnyaconstantize
setelah itu untuk mengubahnya menjadi kelas aktual.classify
adalah bahwa string jamak akan menjadi tunggal ...'age_in_years'.classify
menjadiAgeInYear
4.2.11
Sumber: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method
Untuk tujuan belajar:
Dan untuk varian lowerCase:
sumber
self.split('_').inject([]){ |buffer,e| buffer + [buffer.empty? ? e : e.capitalize] }.join
Benchmark untuk solusi Ruby murni
Saya mengambil setiap kemungkinan yang ada dalam pikiran saya untuk melakukannya dengan kode ruby murni, ini dia:
bermodalkan dan gsub
pisah dan petakan menggunakan
&
steno (terima kasih atas jawaban pengguna3869936)pisah dan petakan (terima kasih untuk jawaban Tuan Black)
Dan di sini adalah Tolok Ukur untuk semua ini, kita dapat melihat bahwa gsub sangat buruk untuk ini. Saya menggunakan 126 080 kata.
sumber
Saya tiba di sini untuk mencari kebalikan dari pertanyaan Anda, dari kasus unta ke kasus ular. Gunakan garis bawah untuk itu (bukan decamelize):
AppUser.name.underscore # => "app_user"
atau, jika Anda sudah memiliki tali unta:
"AppUser".underscore # => "app_user"
atau, jika Anda ingin mendapatkan nama tabel, yang mungkin itulah mengapa Anda menginginkan kotak ular:
AppUser.name.tableize # => "app_users"
sumber
AppUser.table_name
? Anda juga akan memastikan memiliki nama tabel yang sebenarnya jika bukan app_users, tetapi sesuatu yang didefinisikan di tempat lain.Saya merasa sedikit tidak enak untuk menambahkan lebih banyak jawaban di sini. Memutuskan untuk menggunakan pendekatan ruby murni yang paling mudah dibaca dan minimal, mengabaikan tolok ukur yang bagus dari @ ulysse-bn. Meskipun
:class
mode adalah salinan dari @ user3869936,:method
mode yang tidak saya lihat di jawaban lain di sini.Hasilnya adalah:
sumber
PascalCase
adalah bagian dariCamelCase
. Juga ini yang saya tahu - bahwa unta berlaku untuk keduanya. Tapi saya belum pernah menyelidiki. Terima kasih telah menyebutkan PascalCase. en.wikipedia.org/wiki/Camel_case:method
versi melakukan yangdowncase
pertama sehingga dapat digunakan pada keduanyalower_snake_case
danUPPER_SNAKE_CASE
.Sebagian besar metode lain yang tercantum di sini adalah Rails khusus. Jika Anda ingin melakukan ini dengan Ruby murni, berikut ini adalah cara paling ringkas yang saya buat (terima kasih kepada @ ulysse-bn untuk perbaikan yang disarankan)
sumber
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsub
solusi Anda sepertinya lebih lambat dibandingkan denganmap
solusinya.Perpanjang String untuk Menambahkan Camelize
Di Ruby murni Anda bisa memperluas kelas string menggunakan kode yang sama persis dari Rails
.camelize
sumber