Ruby on Rails Callback, apa perbedaan antara: before_save dan: before_create?

184

Bisakah Anda menjelaskan secara rinci apa itu callback Ruby :before_savedan :before_createRails, dan apa hubungannya dengan validasi Rails? Apakah validasi terjadi setelah :before_saveatau :before_create?

Agung Prasetyo
sumber

Jawaban:

363

Dalam operasi pembuatan di bawah Rails, ada enam callback sebelum operasi database, dan dua setelahnya. Secara berurutan, ini adalah:

  1. before_validation
  2. before_validation_on_create
  3. after_validation
  4. after_validation_on_create
  5. before_save
  6. before_create

    INSERT DATABASE
  7. after_create
  8. after_save

Operasi pembaruan memiliki set yang sama persis, kecuali baca updatealih-alih di createmana - mana (dan UPDATE alih-alih INSERT ).

Dari ini, Anda dapat melihat bahwa validasi dilakukan sebelum before_savedan before_createcallback.

The before_saveterjadi sedikit sebelum before_create. Sejauh pengetahuan saya, tidak ada yang terjadi di antara mereka; tetapi before_savejuga akan diaktifkan pada operasi Perbarui, sementara before_createhanya akan menembak pada Create.

Chowlett
sumber
27
before_validation_on_createdan after_validation_on_createdihapus pada Rails 3 , sebagai gantinya gunakan before_validationdan after_validationmasing-masing dengan opsi :on => :create.
Minggu
Bagaimana Anda merujuk ke catatan yang baru saja dibuat saat menggunakan after_saveatau after_create?
bcackerman
@ bcackerman - di after_saveatau after_createcallback, selfadalah catatan yang baru saja disimpan, seperti yang ada setelah simpan. Itu bidang termasuk software otomatis seperti id, created_at, updated_at.
Chowlett
Ingat juga before_createmengacu pada objek baru yang disimpan ke database, bukan createmetode aktual yang dipanggil. Dengan demikian, before_createmasih bisa dipecat bahkan dari savemetode.
Steve
1
@ Rad - er, bukan? Dokumen masih mencantumkan before_save3, dan before_create5.
Chowlett
136

before_savedisebut setiap kali suatu objek disimpan. Jadi untuk objek baru dan yang sudah ada. (buat dan perbarui tindakan)

before_createhanya sebelum penciptaan. Jadi hanya untuk objek baru (buat aksi)

Michael Koper
sumber