Tôi có một mô hình ActiveRecord với cột trạng thái. Khi mô hình được lưu với thay đổi trạng thái, tôi cần ghi vào tệp lịch sử thay đổi trạng thái và ai chịu trách nhiệm về thay đổi. Tôi đã nghĩ rằng một cuộc gọi lại after_save sẽ làm việc tuyệt vời, nhưng tôi không thể sử dụng status_changed? phương pháp động để xác định rằng ghi lịch sử là cần thiết để thực thi. Tôi không muốn viết vào lịch sử nếu mô hình được lưu nhưng trạng thái không thay đổi. Ý nghĩ duy nhất của tôi về xử lý nó ngay bây giờ là sử dụng một cờ biến thể hiện để xác định xem after_save có nên thực hiện hay không. Bất kỳ ý tưởng?Rails after_save gọi lại để tạo mô hình liên quan dựa trên column_changed?
Trả lời
tôi thấy hai giải pháp:
Giống như bạn nói: thêm một lá cờ khác nhau và chạy callback khi nó được thiết lập.
Chạy save_history sau khi cập nhật hồ sơ của bạn.
Ví dụ:
old_status = @record.status
if @record.update\_attributes(params[:record])
save_history_here if old_status != @record.status
flash[:notice] = "Successful!"
...
else
...
end
Sử dụng một callback before_save
để thay thế. Sau đó, bạn có quyền truy cập vào cả giá trị trạng thái mới và cũ. Callbacks được gói trong một giao dịch, vì vậy nếu lưu không thành công hoặc bị hủy bỏ bởi một cuộc gọi lại khác, ghi lịch sử cũng sẽ được khôi phục.
Điều này có thể đã thay đổi kể từ khi câu hỏi đã được đăng, nhưng gọi lại after_save nên có *_changed?
phương pháp năng động sẵn có và thiết lập một cách chính xác:
class Order
after_save :handle_status_changed, :if => :status_changed?
end
hoặc
class Order
after_save :handle_status_changed
def handle_status_changed
return unless status_changed?
...
end
end
trình một cách chính xác đối với tôi w/Đường ray 2.3.2.
Có ai không nghe nói về trình kích hoạt cơ sở dữ liệu không? Nếu bạn viết trình kích hoạt cơ sở dữ liệu on_update trên máy chủ cơ sở dữ liệu, thì mỗi khi bản ghi được cập nhật, nó sẽ tạo bản sao lịch sử các giá trị của bản ghi trước đó trong bảng kiểm toán được liên kết.
Đây là một trong những điều chính tôi coi thường về Rails. Nó dành rất nhiều thời gian để cố gắng làm mọi thứ cho nhà phát triển, nó khiến các nhà phát triển nghĩ rằng họ phải tuân theo những hành động thô tục như viết các phương pháp ray chuyên dụng để làm những gì máy chủ cơ sở dữ liệu freaking đã hoàn toàn có khả năng tự làm tất cả.
lắc đầu tại Rails một lần nữa
- 1. Rails after_save gọi lại được gọi nhiều lần
- 2. Rails sắp xếp các mục dựa trên các thuộc tính của mô hình liên quan
- 3. Gọi lại - after_save nhưng KHÔNG tạo
- 4. Rails - Làm thế nào để tạo ra một mô hình liên quan đến HAI của một mô hình
- 5. after_save gọi lại để đặt cột updated_by thành current_user
- 6. Mã của Crockford liên quan đến Mô hình Gọi Constructor
- 7. Gọi lại có điều kiện trong mô hình của Rails?
- 8. Lọc qua mô hình liên quan django
- 9. hành vi cakephp afterFind không được gọi trên các mô hình liên quan
- 10. Rails mô hình has_many, belongs_to quan hệ
- 11. Ruby on Rails - Mô hình và bảng mối quan hệ
- 12. Rails Tìm kiếm trên nhiều mô hình
- 13. Quan điểm dựa trên lớp cho mối quan hệ M2M với mô hình trung gian
- 14. Rails AR validates_uniqueness_of chống lại mối quan hệ đa hình
- 15. Đường ray: Cập nhật thuộc tính mô hình mà không cần gọi lại số gọi lại
- 16. Rails - Mối quan hệ HABTM - Làm thế nào tôi có thể tìm một bản ghi dựa trên một thuộc tính của mô hình liên kết
- 17. DJANGO: Cách sắp xếp các đối tượng dựa trên thuộc tính của một mô hình liên quan?
- 18. Rails meta_search gem: sắp xếp theo số lượng của một mô hình liên quan
- 19. Rails tìm hoặc tạo dựa trên hai lĩnh vực
- 20. Gọi một phương thức trong mô hình sau khi tìm thấy trong Ruby on Rails
- 21. Select_related() ngược liên quan - mô hình tự động dân số
- 22. Mẫu mô hình django. Bao gồm các trường từ các mô hình liên quan
- 23. Thử nghiệm Đơn vị với Mô hình Django và rất nhiều quan hệ liên quan đến
- 24. Python: mô-đun để tạo lockfile dựa trên PID?
- 25. Hoạt ảnh trên quy mô hình ảnh trên Android có liên quan đến điểm trung tâm
- 26. Dịch liên kết mô hình Rails - không hoạt động
- 27. Gọi phương thức lớp học trong một after_save
- 28. Trình tạo truy vấn trực quan dựa trên web
- 29. Cách định cấu hình tìm kiếm nhiều pg_search trên các mô hình được liên kết trong Rails?
- 30. Thực thi Lệnh gọi Rails Callbacks
Nếu bạn có thể chỉ cho tôi làm thế nào để tạo ra một cơ sở dữ liệu ghi kích hoạt vào một tập tin bản ghi lịch sử, tôi sẽ upvote bạn. – Georges
Tại sao một trình kích hoạt cơ sở dữ liệu bao giờ ghi vào một tệp nhật ký? Mục đích duy nhất của một kích hoạt, trong trường hợp này, phục vụ như một bản ghi hoạt động lịch sử trên bảng kích hoạt được viết cho. Đăng nhập vào một tập tin là trách nhiệm của một ứng dụng. Tôi bắt đầu nghĩ rằng có một thiếu cơ bản về hiểu hệ thống cơ bản. Nhưng, chúng ta đang nói về Rails. Vì vậy, tôi đoán rằng giải thích "làm tất cả mọi thứ mà không biết tại sao" tâm lý. Không có tội, Georges. Nhưng Rails là một sự đảo lộn của lập trình thông thường ở mức tốt nhất. – Skittles
Ah, xin lỗi. Tôi đoán ban đầu tôi đã đọc nhận xét của bạn vì nhận xét ban đầu đã đề cập đến một tệp * lịch sử *. Bạn nói đúng. Bảng kiểm tra và trình kích hoạt tốt hơn nhiều trong trường hợp này. Được thăng hạng. – Georges