###1. Migration Class for Adding Some Delete Flags
$ rails g migration add_deleted_to_purchase_requests deleted:boolean deleted_at:datetime deleted_by:references
###2. Modification of Migration Class for Adding Foreign Key
class AddDeletedToPurchaseRequests < ActiveRecord::Migration
def change
add_column :purchase_requests, :deleted, :boolean, default: false
add_column :purchase_requests, :deleted_at, :datetime
add_reference :purchase_requests, :deleted_by, index: true
add_foreign_key :purchase_requests, :users, column: :deleted_by_id
end
end
###3. User
Model Class
class User < ActiveRecord::Base
...
has_many deleted_purchase_requests, class_name: "PurchaseRequest", foreign_key: :deleted_by_id, dependent: :destroy
...
end
###4. PurchaseRequest
Model Class
class PurchaseRequest < ActiveRecord::Base
...
belongs_to deleted_by, class_name: "User"
...
end
###5. Adding Some Methods to PurchaseRequest Class for Soft Deleting
class PurchaseRequest
.
.
.
def soft_destroy(user)
self.deleted = true
self.deleted_at = Time.now
self.deleted_by = user
self.save
end
def restore_soft_destroyed
self.deleted = false
self.deleted_at = nil
self.deleted_by = nil
self.save
end
.
.
.
end
###6. Adding Some Actions to purchase_requests
Controller
.
.
.
def destroy
authorize_action_for @purchase_request
# @purchase_request.destroy
@purchase_request.soft_destroy(current_user)
respond_to do |format|
format.html { redirect_to (params[:group_purchase_id] ? group_purchase_purchase_requests_url : purchase_requests_url), notice: 'Purchase request was successfully destroyed.' }
format.json { head :no_content }
end
end
.
.
.