Tôi đang làm việc trên ứng dụng Rails 3.2.8 sử dụng API REST trong nhà để chèn dữ liệu mới. Logic chèn là chung cho mọi điểm cuối và kết quả khá đơn giản trong một cuộc gọi đến Model.save.Ghi đè đường ray Lưu để thực hiện cập nhật có chọn lọc
Đối với một trong các loại mô hình, trước tiên tôi muốn kiểm tra xem có tồn tại một bản ghi đã tồn tại chưa và nếu có, hãy cập nhật thay vì chèn. Nếu mã cho phép tôi tương tác ở cấp điều khiển, điều này sẽ dễ dàng thông qua việc sử dụng find_or_create_by, tuy nhiên (tôi nghĩ) tùy chọn duy nhất của tôi là ghi đè phương thức lưu trong Mô hình hoặc sử dụng gọi lại before_save.
Tôi đang cố gắng tìm ra cách để thực hiện công việc này, vì mọi cuộc gọi để lưu hoặc update_attributes bên trong Mô hình đơn giản dẫn đến vòng lặp vô hạn (vì lý do hiển nhiên). Có cách nào để sử dụng before_save hoặc ghi đè lưu theo cách mà trước tiên tôi có thể kiểm tra xem bản ghi có tồn tại với thuộc tính x và y không và nếu có, hãy truy lục bản ghi đó và thực hiện cập nhật, nếu không hãy tiếp tục với tiêu chuẩn ActiveRecord tiết kiệm?
Đây là mã của tôi vì nó hiện đang đứng bên trong mô hình hoạt động, mà không làm việc do các vấn đề vòng lặp vô hạn:
def save
a = UserActivity.find_or_initialize_by_user_id_and_activity_id(user_id: user_id, activity_id: activity_id)
a.update_attributes start_at: start_at, end_at: end_at.....
end
tôi cảm thấy như chỉnh sửa 'save' có thể mở toàn bộ các sâu của các vấn đề nhạy cảm với cơ sở dữ liệu. Bạn có xem xét đơn giản bằng cách sử dụng câu lệnh 'if - else' kết hợp với' update_attributes' và 'save' không? –