2012-02-17 40 views
6

Tôi đã thử rất nhiều thứ để ghi đè hành vi của phương thức: hủy nhưng không có gì hoạt động. Trước tiên tôi đã sử dụng plugin actions_as_paranoia, nhưng nó không hoạt động với mô hình trong một has_many: thông qua liên kết.Đường ray: cách ghi đè: phương thức tiêu diệt?

Tôi muốn ghi đè lên: phá hủy phương pháp chỉ để làm một cái gì đó như thế này:

def destroy 
    _run_destroy_callbacks { delete } 
    end 

    def delete  
    self.update_attribute(:status => 0) 
    freeze 
    end 

Đó là, tôi chỉ muốn cập nhật một lĩnh vực (trạng thái 0) thay vì phá hủy các hồ sơ riêng của mình.

Trả lời

5

Các bạn đã thử ?:

class MyClass < ActiveRecord::Base 
    def destroy 
    update_attribute(:status, 0) 
    end 
end 

EDIT: Căn cứ vào ý kiến, có thể có cái gì khác tại nơi làm việc và nó chỉ có thể là (: phụ thuộc => '') chỉ định vào định nghĩa hiệp hội - hoặc nếu đó là HABTM, nó có thể không hoạt động. Có lẽ this info on delete and destroy through associations sẽ giúp ích? Đã dán phần có liên quan bên dưới:

Xóa hoặc hủy?

các liên kết has_many và has_and_belongs_to_many có các phương pháp tiêu diệt, xóa, destroy_all và delete_all.

Đối với has_and_belongs_to_many, xóa và hủy là giống nhau: chúng làm cho bản ghi trong bảng kết nối bị xóa.

Đối với has_many, phá hủy sẽ luôn gọi phương thức hủy của các bản ghi bị xóa để các cuộc gọi lại được chạy. Tuy nhiên, xóa sẽ thực hiện xóa theo chiến lược được chỉ định bởi tùy chọn : phụ thuộc hoặc nếu không: tùy chọn phụ thuộc được cung cấp, sau đó nó sẽ làm theo chiến lược mặc định. Chiến lược mặc định là: nullify (đặt khóa ngoài thành 0), ngoại trừ has_many: thông qua, trong đó chiến lược mặc định là delete_all (xóa bản ghi tham gia, mà không cần chạy các cuộc gọi lại ).

+0

Vâng, đó là điều đầu tiên tôi thử. Điều này không có gì. Tôi có thể thấy yêu cầu DELETE FROM trong nhật ký của mình. Phương thức phá hủy tùy chỉnh dường như không được gọi. –

+0

Hrm, tôi thực sự sử dụng điều này trong một số mô hình trong một số ứng dụng và nó hoạt động mà không bị lỗi. Có bất cứ điều gì 'đặc biệt' với mô hình cụ thể này và bạn đang gọi xóa hay phá hủy? Bạn sẽ muốn sau này. – miked

+0

Bản ghi bị phá hủy từ cha mẹ của nó trong một AREL (quan hệ ActiveRecord), có lẽ đó là vấn đề?Trong thực tế, tôi cập nhật mẫu và bản ghi rượu của tôi (biểu mẫu chính, phương thức cập nhật trong bộ điều khiển), và nếu tôi chọn xóa đứa trẻ (mô hình giống có chứa tiêu diệt tùy chỉnh), nó không được gọi là rõ ràng. Có lẽ, cơ chế đường ray là khác nhau để phá hủy nếu nó là cha mẹ phá hủy đứa trẻ (không gọi phá hủy trên mô hình con?) –

0

Như MikeD nói, mã này là tốt nếu chúng ta muốn để tiêu diệt các loại tốt "bằng tay":

@varietal = Varietal.find('1')  
@varietal.destroy 

def destroy 
    update_attribute(:status, 0) 
end 

này hoạt động hoàn hảo. Tuy nhiên, như tôi đã nói, nếu chúng tôi cập nhật hồ sơ gốc, tôi không tìm thấy phương thức hủy/xóa/xóa_all được gọi trên ... Vì vậy, nếu ai đó có ý tưởng ...

2

Tôi nghĩ rằng tốt nhất cách để làm điều này là để ghi đè lên các bộ lọc before_destroy: để thao tác phụ thuộc:

def Model 
    before_destroy: mark_as_deleted 

    def mark_as_deleted 
     self.update_attribute(:status => 0) 
    end 
end 

này sẽ không hủy bỏ destroy mặc dù.

The full callback documentation is here.

+0

Điều này vẫn gọi destr() trong bộ điều khiển, nó chỉ chạy qua def của bạn đầu tiên. Trả về false không hoạt động, ít nhất không phải là tôi có thể nói. –

Các vấn đề liên quan