Apakah ada alternatif untuk update_attributes yang tidak menyimpan catatan?
Jadi saya bisa melakukan sesuatu seperti:
@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save
BTW, saya tahu saya bisa @car.model = 'Sierra'
, tetapi saya ingin memperbarui semuanya dalam satu baris.
assign_attributes
apidock.com/rails/ActiveRecord/Base/assign_attributesJawaban:
Saya percaya apa yang Anda cari
assign_attributes
.Ini pada dasarnya sama dengan update_attributes tetapi tidak menyimpan catatan:
sumber
attr_accessible :is_admin, :as => :admin
:;)attr_protected :is_admin
. Atau:attr_accessible :name
Intinya adalah bahwa dalam contoh ini,: is_admin dilindungi. Saya juga harus mencatat bahwa upaya untuk secara massal menetapkan atribut yang dilindungi dengan.assign_attributes
memang meningkatkanActiveModel::MassAssignmentSecurity::Error
, meskipun itu tidak ditampilkan dalam contoh.user.assign_attributes({ :name => 'Josh', :is_admin => true })
memunculkan pesan kesalahan dan tidak benar-benar mengatur properti nama pengguna.Anda dapat menggunakan
assign_attributes
atauattributes=
(mereka sama)Perbarui metode cheat sheet (untuk Rails 6):
update
=assign_attributes
+save
attributes=
= alias dariassign_attributes
update_attributes
= usang, alias dariupdate
Sumber:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment .rb
Lembar cheat lain:
http://www.davidverhasselt.com/set-attributes-in-activerecord/#cheat-sheet
sumber
Anda dapat menggunakan metode 'atribut':
Sumber: http://api.rubyonrails.org/classes/ActiveRecord/Base.html
atribut = (new_attributes, guard_protected_attributes = true) Memungkinkan Anda untuk mengatur semua atribut sekaligus dengan mengirimkan hash dengan kunci yang cocok dengan nama atribut (yang lagi-lagi cocok dengan nama kolom).
Jika guard_protected_attributes benar (default), maka atribut sensitif dapat dilindungi dari bentuk penugasan massal ini dengan menggunakan makro attr_protected. Atau Anda dapat menentukan atribut mana yang dapat diakses dengan makro attr_accessible. Maka semua atribut yang tidak termasuk di dalamnya tidak akan diizinkan untuk ditetapkan secara massal.
sumber
Untuk penetapan nilai secara massal ke model ActiveRecord tanpa menyimpan, gunakan salah satu
assign_attributes
atauattributes=
metode . Metode ini tersedia di Rails 3 dan yang lebih baru. Namun, ada perbedaan kecil dan yang terkait dengan versi gotcha yang harus diperhatikan.Kedua metode mengikuti penggunaan ini:
Perhatikan bahwa tidak ada metode yang akan melakukan validasi atau mengeksekusi panggilan balik; panggilan balik dan validasi akan terjadi ketika
save
dipanggil.Rel 3
attributes=
sedikit berbeda dariassign_attributes
dalam Rails 3.attributes=
akan memeriksa bahwa argumen yang diteruskan ke Hash adalah, dan kembali segera jika tidak;assign_attributes
tidak memiliki pemeriksaan hash semacam itu. Lihat dokumentasi API Penugasan Atribut ActiveRecord untukattributes=
.Kode tidak valid berikut akan gagal secara diam-diam dengan hanya mengembalikan tanpa menetapkan atribut:
attributes=
akan diam-diam bersikap seolah-olah penugasan itu berhasil, padahal sebenarnya tidak.Kode yang tidak valid ini akan memunculkan eksepsi ketika
assign_attributes
mencoba merangkai kunci hash dari array terlampir:assign_attributes
akan memunculkanNoMethodError
pengecualian untukstringify_keys
, menunjukkan bahwa argumen pertama bukan Hash. Pengecualian itu sendiri tidak terlalu informatif tentang penyebab sebenarnya, tetapi fakta bahwa pengecualian memang terjadi adalah sangat penting.Satu-satunya perbedaan antara kasus-kasus ini adalah metode yang digunakan untuk penugasan massal:
attributes=
berhasil dengan diam-diam, danassign_attributes
menimbulkan pengecualian untuk menginformasikan bahwa telah terjadi kesalahan.Contoh-contoh ini mungkin tampak dibuat-buat, dan mereka pada tingkat tertentu, tetapi jenis kesalahan ini dapat dengan mudah terjadi ketika mengkonversi data dari API, atau bahkan hanya menggunakan serangkaian transformasi data dan lupa dengan
Hash[]
hasil akhir.map
. Pertahankan beberapa kode 50 baris di atas dan 3 fungsi dihapus dari penugasan atribut Anda, dan Anda punya resep untuk kegagalan.Pelajaran dengan Rails 3 adalah ini: selalu gunakan
assign_attributes
bukanattributes=
.Rel 4
Di Rails 4,
attributes=
hanyalah sebuah alias untukassign_attributes
. Lihat dokumentasi API Penugasan Atribut ActiveRecord untukattributes=
.Dengan Rails 4, metode mana pun dapat digunakan secara bergantian. Kegagalan untuk melewatkan Hash karena argumen pertama akan menghasilkan pengecualian yang sangat membantu:
ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validasi
Jika Anda melakukan pra-penerbangan penugasan dalam persiapan untuk
save
, Anda mungkin juga tertarik untuk memvalidasi sebelum menyimpan. Anda dapat menggunakanvalid?
daninvalid?
metode untuk ini. Keduanya mengembalikan nilai boolean.valid?
mengembalikan true jika model yang belum disimpan melewati semua validasi atau false jika tidak.invalid?
hanyalah kebalikan darivalid?
valid?
dapat digunakan seperti ini:Ini akan memberi Anda kemampuan untuk menangani masalah validasi sebelum menelepon
save
.sumber