Object.update_attribute(:only_one_field, "Some Value")
Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")
Kedua hal ini akan memperbarui objek tanpa harus secara eksplisit memberi tahu AR untuk memperbarui.
API Rails mengatakan:
untuk update_attribute
Memperbarui atribut tunggal dan menyimpan catatan tanpa melalui prosedur validasi normal. Ini sangat berguna untuk bendera boolean pada catatan yang ada. Metode update_attribute reguler di Base diganti dengan ini ketika modul validasi dicampur, yang secara default.
untuk update_attributes
Memperbarui semua atribut dari Hash yang dilewatkan dan menyimpan catatan. Jika objek tidak valid, penyimpanan akan gagal dan false akan dikembalikan.
Jadi jika saya tidak ingin objek divalidasi saya harus menggunakan update_attribute. Bagaimana jika saya memiliki pembaruan ini pada before_save, apakah itu stackoverflow?
Pertanyaan saya adalah apakah update_attribute juga memotong sebelum menyimpan atau hanya validasi.
Juga, apa sintaks yang benar untuk mengirimkan hash ke update_attributes ... lihat contoh saya di atas.
sumber
update_attribute
pernyataan ke dalambefore_save
callback? Saya tidak bisa memikirkan alasan yang bagus untuk ini.before_save
panggilan balik). Fe bukannyaupdate_attribute(:discount, 0.1) if amount > 100
Anda bisa lakukandiscount = 0.1 if amount > 100
.update_attribute
panggilansave
pada objek, yang tidak perlu dalam kasus ini, karena pernyataan itu ada di dalambefore_save
panggilan balik dan akan tetap disimpan. Saya harap itu masuk akal.Jawaban:
Silakan merujuk
update_attribute
. Pada mengklik sumber acara Anda akan mendapatkan kode berikutdan sekarang merujuk
update_attributes
dan melihat kodenya yang Anda dapatkanperbedaan antara keduanya adalah
update_attribute
kegunaansave(false)
sedangkanupdate_attributes
kegunaansave
atau bisa dikatakansave(true)
.Maaf untuk deskripsi panjang tapi yang ingin saya katakan adalah penting.
save(perform_validation = true)
, jikaperform_validation
salah ia mem-bypass (melompati akan menjadi kata yang tepat) semua validasi yang terkait dengannyasave
.Untuk pertanyaan kedua
Contoh Anda benar.
atau
atau jika Anda mendapatkan semua data bidang & nama dalam hash katakan di
params[:user]
sini gunakan sajasumber
Rails 3
. Ia mengatakan dengan sangat jelas di komentar di sumber bahwa "Callback dipanggil".update_attributes
sekarang adalah alias untukupdate
Kiat:
update_attribute
sedang tidak digunakan lagi dalam Rails 4 melalui Commit a7f4b0a1 . Itu menghapusupdate_attribute
mendukungupdate_column
.sumber
update_attribute
melompati validasi, tetapi menghormati callback,update_column
akan melewati validasi dan callback dan tidak memperbarui:updated_at
,update
adalah fungsi normal yang akan menghormati callback dan validasiupdate_column
tidak ditinggalkan, tetapiupdate_columns(name: value)
disukai.reset_column
telah dihapus.update_attribute
Metode ini memperbarui atribut objek tunggal tanpa memohon validasi berbasis model.
update_attributes
Metode ini memperbarui beberapa atribut objek tunggal dan juga lulus validasi berbasis model.
Semoga jawaban ini akan menjelaskan kapan harus menggunakan metode rekaman aktif apa.
sumber
Yang juga perlu diperhatikan adalah bahwa dengan
update_attribute
, atribut yang diinginkan untuk diperbarui tidak perlu dicantumkan dengan putihattr_accessible
untuk memperbaruinya sebagai lawan dari metode penugasan massalupdate_attributes
yang hanya akan memperbaruiattr_accessible
atribut yang ditentukan.sumber
update_attribute
cukup hanya memperbarui satu atribut dari suatu model, tetapi kita dapat melewatkan beberapa atribut dalamupdate_attributes
metode.Contoh:
Itu lulus validasi
itu tidak diperbarui jika validasi gagal.
sumber
Jawaban yang bagus perhatikan bahwa untuk ruby 1.9 dan di atas Anda bisa (dan saya pikir harus) menggunakan sintaks hash baru untuk update_attributes:
sumber
Anda mungkin tertarik mengunjungi posting blog ini mengenai semua cara yang memungkinkan untuk menetapkan atribut atau memperbarui catatan (diperbarui ke Rails 4)
update_attribute, update, update_column, update_columns etc.
http://www.davidverhasselt.com/set-attributes-in-activerecord/ . Misalnya itu berbeda dalam aspek seperti menjalankan validasi, menyentuh updated_at objek atau memicu panggilan balik.Sebagai jawaban untuk pertanyaan OP
update_attribute
tidak melalui panggilan balik.sumber
update_attribute
danupdate_attributes
serupa, tetapi dengan satu perbedaan besar:update_attribute
tidak menjalankan validasi.Juga:
update_attribute
digunakan untuk memperbarui catatan dengan atribut tunggal .update_attributes
digunakan untuk memperbarui catatan dengan banyak atribut.Kedua metode ini sangat mudah membingungkan mengingat nama dan karya mereka yang serupa. Oleh karena itu,
update_attribute
sedang dihapus demiupdate_column
.Sekarang di Rails4 Anda dapat menggunakannya
Model.update_column(:column_name, column_value)
di tempatModel.update_attribute(:column_name, column_value)
Klik di sini untuk mendapatkan info lebih lanjut tentang
update_column
.sumber
Untuk menjawab pertanyaan Anda,
update_attribute
lewati pra simpan "validasi" tetapi masih menjalankan panggilan balik lainnya sepertiafter_save
dll. Jadi, jika Anda benar-benar ingin "perbarui kolom dan lewati saja pengarsipan AR" maka Anda perlu menggunakan (tampaknya)Model.update_all(...)
lihat https://stackoverflow.com/a/7243777/32453sumber
Baru-baru ini saya bertemu
update_attribute
vsupdate_attributes
dan validasi, nama yang sangat mirip, perilaku yang berbeda, sangat membingungkan.Untuk lulus
update_attribute
validasi hash ke dan memotong, Anda dapat melakukan:sumber
Saya pikir pertanyaan Anda adalah apakah memiliki update_attribute di before_save akan mengarah ke dan loop tanpa akhir (dari panggilan update_attribute di before_save panggilan balik, awalnya dipicu oleh panggilan update_attribute)
Saya cukup yakin itu memotong callback before_save karena tidak benar-benar menyimpan catatan. Anda juga dapat menyimpan catatan tanpa memicu validasi dengan menggunakan
Model.save false
sumber