Katakanlah saya punya Gift
objek dengan @name = "book"
& @price = 15.95
. Apa cara terbaik untuk mengonversinya menjadi Hash {name: "book", price: 15.95}
di Ruby, bukan Rails (walaupun merasa bebas untuk memberikan jawaban Rails juga)?
ruby
object
hashmap
instance-variables
ma11hew28
sumber
sumber
Gift
adalah persis seperti @nash telah ditetapkan , kecuali, 2) yakin, variabel instance dapat memiliki accesor pembaca. 3) Semua atribut dalam hadiah.Jawaban:
Atau dengan
each_with_object
:sumber
var.to_s.delete("@")
denganvar[1..-1].to_sym
untuk mendapatkan simbol.gift.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@")] = gift.instance_variable_get(var) }
dan singkirkan jejaknya; hash
each
.map
daninject
jauh lebih kuat. Ini adalah salah satu keraguan desain yang saya miliki dengan Ruby:map
daninject
diterapkan denganeach
. Ini hanya ilmu komputer yang buruk.hash = Hash[gift.instance_variables.map { |var| [var.to_s[1..-1], gift.instance_variable_get(var)] } ]
Katakan saja (objek saat ini)
.attributes
.attributes
mengembalikanhash
apapunobject
. Dan juga jauh lebih bersih.sumber
.values
: sequel.jeremyevans.net/rdoc/classes/Sequel/Model/…instance_values
dapat digunakan untuk semua objek ruby untuk output yang sama.Menerapkan
#to_hash
?sumber
Use :: for describing class methods, # for describing instance methods, and use . for example code
(sumber: ruby-doc.org/documentation-guidelines.html ) Juga, dokumentasi resmi (seperti CHANGELOG ruby, github.com/ruby/ruby/roby/blob/v2_1_0/NEWS ) menggunakan#
metode instan dan titik untuk metode kelas cukup konsisten.each_with_object
:instance_variables.each_with_object(Hash.new(0)) { |element, hash| hash["#{element}".delete("@").to_sym] = instance_variable_get(element) }
sumber
instance_values
. Perhatikan bahwa Matt meminta cara Ruby, khususnya bukan Rails.Anda bisa menggunakan
as_json
metode. Ini akan mengubah objek Anda menjadi hash.Tapi, hash itu akan datang sebagai nilai untuk nama objek itu sebagai kunci. Dalam kasus anda,
Jika Anda membutuhkan hash yang disimpan dalam penggunaan objek
as_json(root: false)
. Saya pikir secara default root akan salah. Untuk info lebih lanjut lihat panduan ruby resmihttp://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
sumber
Untuk Objek Rekaman Aktif
lalu panggil saja
sumber
Jika Anda tidak berada dalam lingkungan Rails (mis. Tidak memiliki ActiveRecord tersedia), ini mungkin membantu:
sumber
sumber
Anda dapat menulis solusi yang sangat elegan menggunakan gaya fungsional.
sumber
Anda harus mengganti
inspect
metode objek Anda untuk mengembalikan hash yang diinginkan, atau hanya menerapkan metode yang sama tanpa mengabaikan perilaku objek default.Jika Anda ingin mendapatkan pelamun, Anda dapat beralih di atas variabel instance objek dengan object.instance_variables
sumber
Konversi objek Anda secara hash menjadi hash menggunakan permata 'hashable' ( https://rubygems.org/gems/hashable ) Contoh
sumber
Mungkin ingin mencoba
instance_values
. Itu berhasil bagi saya.sumber
Menghasilkan salinan dangkal sebagai objek hash hanya atribut model
Periksa jenis objek yang dihasilkan
sumber
Jika Anda perlu objek bersarang untuk dikonversi juga.
sumber
Gift.new.attributes.symbolize_keys
sumber
Untuk melakukan ini tanpa Rails, cara yang bersih adalah dengan menyimpan atribut pada konstanta.
Dan kemudian, untuk mengonversi instance
Gift
keHash
, Anda dapat:Ini adalah cara yang baik untuk melakukan ini karena hanya akan memasukkan apa yang Anda definisikan
attr_accessor
, dan tidak setiap variabel instan.sumber
Saya mulai menggunakan struct untuk mempermudah konversi hash. Alih-alih menggunakan bare struct saya membuat kelas saya sendiri yang berasal dari hash ini memungkinkan Anda untuk membuat fungsi Anda sendiri dan mendokumentasikan properti kelas.
sumber