Kiểm tra xem hồ sơ có bị phá hủy trong đường ray hay không


83

Vì vậy, có

record.new_record?

Để kiểm tra xem có gì mới không

Tôi cần kiểm tra xem có điều gì đó đang diễn ra không.

record = some_magic
record.destroy
record.is_destroyed? # => true

Đại loại vậy. Tôi biết phá hủy đóng băng đối tượng, đóng băng như vậy? loại công việc, nhưng có điều gì đó rõ ràng cho nhiệm vụ này không?

Câu trả lời:


51

Bạn có thể làm được việc này.

Record.exists?(record)

Tuy nhiên, điều đó sẽ ảnh hưởng đến cơ sở dữ liệu không thực sự cần thiết. Giải pháp khác duy nhất mà tôi biết là thực hiện gọi lại nhưIV đã đề cập.

attr_accessor :destroyed
after_destroy :mark_as_destroyed
def mark_as_destroyed
  self.destroyed = true
end

Và sau đó kiểm tra record.destroyed.


2
Tôi nghĩ rằng một số ngữ cảnh là hữu ích ở đây. Nó phụ thuộc vào lý do tại sao bạn muốn biết nếu một đối tượng đã bị phá hủy. Nếu bạn đang thực hiện nó như một phần của bài kiểm tra đơn vị, thì việc đánh thêm vào cơ sở dữ liệu là tốt. Nếu bạn đang làm nó như một phần của ứng dụng, thì việc đi theo con đường thứ hai có thể là một lựa chọn tốt hơn.
Jerhinesmith

67
Điều này không còn cần thiết nữa, hãy sử dụngobject.destroyed?
Rob

2
trong Rails 4, DEPRECATION WARNING: You are passing an instance of ActiveRecord::Base to tồn tại? . Please pass the id of the object by calling .id.
Minqi Pan

5
Vẫn cần Record.exists?thông số kỹ thuật của bộ điều khiển, vì tôi không thể tải lại bản ghi đã bị phá hủy để kiểm tra xem nó có đúng không destroyed?. Nhưng nếu tôi có biến cá thể để kiểm tra assings, thì tôi có thể sử dụng destroyed?.
denis.peplin

@Daniel Huckstep, nếu bạn vẫn còn sống, vui lòng thay đổi câu trả lời được chấp nhận thành câu đúng!
Daniel


11

Điều này sẽ đến rất sớm. Trong bài đăng Riding Rails mới nhất , nó nói thế này:

Và cuối cùng, nó không nhất thiết phải liên quan đến BugMash, nhưng José Valim - trong số hàng chục cam kết khác - đã thêm model.destroyed ?. Phương thức tiện lợi này sẽ chỉ trả về true nếu trường hợp bạn đang xem đã bị hủy thành công.

Vậy là xong. Sắp có!


6

Trong khi record.destroyed? hoạt động tốt và trả về true hoặc false, bạn cũng có thể KHÔ điều này lên một chút và tạo điều kiện if trên dòng mà bạn gọi là hủy trong bộ điều khiển của mình.

record = Object.find(params[:id])
if record.destroy
  ... happy path
else
  ... sad path
end

Nhận ra bài đăng này hơi muộn trong trò chơi. Nhưng có ai muốn thảo luận thêm về điều này không, tôi là trò chơi! Lưu ý bên: Tôi cũng đã có xác thực after_destroy trên mô hình của mình và trong khi nó hoạt động, một phương pháp riêng biệt cho một cái gì đó như thế này có vẻ như quá mức cần thiết;)


5

destroying một đối tượng không trả về bất cứ điều gì khác ngoài một cuộc gọi đến freeze(theo như tôi biết), vì vậy tôi nghĩ frozen?là đặt cược tốt nhất của bạn. Tùy chọn khác của bạn là giải cứu khỏi ActiveRecord::RecordNotFoundnếu bạn đã làm điều gì đó như thế record.reload.

Tôi nghĩ rằng chiến thuật của Mike ở trên có thể là tốt nhất, hoặc bạn có thể viết một trình bao bọc cho những trường hợp được đề cập này nếu bạn muốn bắt đầu 'đưa ra các giả định'.

Chúc mừng.


Tôi hiện chỉ kiểm tra đóng băng ?, nhưng thực sự tôi có thể tải một cái gì đó và đóng băng nó cho một số mục đích khác, và đó sẽ là một lời nói dối ... Trong tình huống hiện tại, đóng băng? hoạt động tốt, nhưng tôi không muốn dựa vào nó lâu dài.
Daniel Huckstep

0

Nếu không biết thêm logic của ứng dụng của bạn, tôi nghĩ rằng nó bị đóng băng? là đặt cược tốt nhất của bạn.

Nếu không thực hiện được, bạn chắc chắn có thể thêm thuộc tính "bị phá hủy" vào các mô hình của mình mà bạn kích hoạt trong lệnh gọi lại và có thể được kiểm tra nếu bạn muốn có giải pháp chính xác hơn.

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.