Saya memiliki objek berikut yang telah dibuat
@post = Post.create(:name => 'test', :post_number => 20, :active => true)
Setelah ini disimpan, saya ingin dapat mengembalikan objek ke hash, misalnya dengan melakukan sesuatu seperti:
@object.to_hash
Bagaimana ini mungkin dari dalam rel?
ruby-on-rails
ruby
ben morgan
sumber
sumber
.to_json
akan meminta DB jika model tidak lengkapjoins
danselect
,,Person.joins(:address).select("addresses.street, persons.name").find_by_id(id).attributes
akan kembali{ street: "", name: "" }
as_json
, itu akan memanggilserializable_hash
yang, pada gilirannya, akan memanggilattributes
! Jadi saran Anda sebenarnya menambahkan dua lapisan kompleksitasattributes
, menjadikannya lebih mahal..as_json
akan membuat serial objek menjadi ruby hashDi versi Rails terbaru (tidak tahu yang mana tepatnya), Anda bisa menggunakan
as_json
metode ini:Akan menghasilkan:
Untuk melangkah lebih jauh, Anda bisa mengganti metode itu untuk menyesuaikan cara atribut Anda muncul, dengan melakukan sesuatu seperti ini:
Kemudian, dengan contoh yang sama seperti di atas, akan menampilkan:
Ini tentu saja berarti Anda harus secara eksplisit menentukan atribut mana yang harus ditampilkan.
Semoga ini membantu.
EDIT:
Anda juga dapat memeriksa permata Hashifiable .
sumber
as_json memiliki cara yang sangat fleksibel untuk mengkonfigurasi objek kompleks sesuai dengan hubungan model
CONTOH
Kampanye model milik toko dan memiliki satu daftar
Daftar model memiliki banyak list_tasks dan masing-masing list_tasks memiliki banyak komentar
Kita bisa mendapatkan satu json yang menggabungkan semua data itu dengan mudah.
Metode pemberitahuan :: tag dapat membantu Anda melampirkan objek tambahan yang tidak memiliki hubungan dengan orang lain. Anda hanya perlu mendefinisikan metode dengan tag nama dalam kampanye model . Metode ini harus mengembalikan apa pun yang Anda butuhkan (mis. Tags.all)
Dokumentasi resmi untuk as_json
sumber
to_
varian tampaknya bekerja hampir persis sama denganas_
varian, kecuali untuk output dikutip. Satu-satunya hal yang saya tidak suka adalah tidak menjaga urutan kriteria filter saya. Tampaknya diurutkan berdasarkan abjad. Saya pikir itu terkait dengan permata awesome_print yang saya miliki di lingkungan saya, tapi saya tidak berpikir itu masalahnya.Anda bisa mendapatkan atribut dari objek model yang dikembalikan sebagai hash menggunakan salah satu
atau
as_json
memungkinkan Anda untuk menyertakan asosiasi dan atributnya serta menentukan atribut mana yang akan disertakan / dikecualikan (lihat dokumentasi ). Namun, jika Anda hanya memerlukan atribut objek dasar, pembandingan di aplikasi saya dengan ruby 2.2.3 dan rail 4.2.2 menunjukkan bahwaattributes
membutuhkan waktu kurang dari setengah waktuas_json
.sumber
Ada beberapa saran bagus di sini.
Saya pikir perlu dicatat bahwa Anda dapat memperlakukan model ActiveRecord sebagai hash seperti:
Oleh karena itu, alih-alih menghasilkan hash atribut, Anda dapat menggunakan objek itu sendiri sebagai hash.
sumber
Anda pasti bisa menggunakan atribut untuk mengembalikan semua atribut tetapi Anda bisa menambahkan metode instance ke Posting, sebut saja "to_hash" dan minta itu mengembalikan data yang Anda inginkan dalam hash. Sesuatu seperti
sumber
tidak yakin apakah itu yang Anda butuhkan tetapi coba ini di konsol ruby:
jelas itu akan mengembalikan Anda hash di konsol. jika Anda ingin mengembalikan hash dari dalam metode - alih-alih hanya "h" coba gunakan "return h.inspect", sesuatu yang mirip dengan:
sumber
Solusi saya:
sumber
Jawaban Swanand luar biasa.
jika Anda menggunakan FactoryGirl, Anda bisa menggunakan
build
metode untuk menghasilkan hash atribut tanpa kunciid
. misalnyasumber
Pertanyaan lama, tetapi sangat direferensikan ... Saya pikir kebanyakan orang menggunakan metode lain, tetapi ada fakta
to_hash
metode yang benar, itu harus diatur dengan benar. Secara umum, pemetik adalah jawaban yang lebih baik setelah rail 4 ... menjawab ini terutama karena saya harus mencari banyak untuk menemukan utas ini atau apa pun yang berguna & dengan asumsi orang lain memukul masalah yang sama ...Catatan: tidak merekomendasikan ini untuk semua orang, tetapi kasus tepi!
Dari batu ruby on rails ... http://api.rubyonrails.org/classes/ActiveRecord/Result.html ...
sumber