Ruby on Rails Callback, sự khác biệt giữa: before_save và: before_create là gì?


183

Bạn có thể giải thích một cách chi tiết những gì :before_save:before_createRuby on Rails callbacks, và những gì họ phải làm với Rails kiểm chứng thực? Có xác nhận xảy ra sau :before_savehay :before_create?

Câu trả lời:


363

Trong thao tác tạo bên dưới Rails, có sáu cuộc gọi lại trước hoạt động cơ sở dữ liệu và hai lần sau. Theo thứ tự, đây là:

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

    XÁC NHẬN
  7. after_create
  8. after_save

Các hoạt động cập nhật có chính xác cùng một bộ, ngoại trừ đọc updatethay vì createở mọi nơi (và CẬP NHẬT thay vì INSERT ).

Từ điều này, bạn có thể thấy rằng xác nhận được thực hiện trước before_savevà các before_createcuộc gọi lại.

Việc before_savexảy ra một chút trước khi before_create. Theo hiểu biết tốt nhất của tôi, không có gì xảy ra giữa họ; nhưng before_savecũng sẽ kích hoạt các hoạt động Cập nhật, trong khi before_createsẽ chỉ bắn vào Creates.


27
before_validation_on_createafter_validation_on_createđược loại bỏ kể từ Rails 3 , thay vào đó sử dụng before_validationafter_validationtương ứng với tùy chọn :on => :create.
CN

Làm thế nào bạn sẽ đề cập đến bản ghi vừa được tạo khi sử dụng after_savehoặc after_create?
bcackerman

@bcackerman - trong after_savehoặc after_creategọi lại, selflà bản ghi vừa được lưu, vì nó tồn tại sau khi lưu. Đó là lĩnh vực bao gồm autogenerated thích id, created_at, updated_at.
Chowlett

Cũng nhớ rằng before_createđề cập đến một đối tượng mới đang được lưu vào cơ sở dữ liệu, chứ không phải createphương thức thực tế được gọi. Vì vậy, before_createvẫn có thể bị sa thải ngay cả từ savephương pháp.
Steve

1
@Rads - er, không? Các tài liệu vẫn liệt kê before_savethứ 3 và before_createthứ 5.
Chowlett

136

before_saveđược gọi mỗi khi một đối tượng được lưu. Vì vậy, đối với các đối tượng mới và hiện có. (tạo và cập nhật hành động)

before_createchỉ trước khi sáng tạo. Vì vậy, chỉ cho các đối tượng mới (tạo hành động)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.