Skip to content

Instantly share code, notes, and snippets.

@luciuschoi
Last active June 2, 2016 11:30
Show Gist options
  • Save luciuschoi/0eec7191a9c5d45f0470f8b04a143c51 to your computer and use it in GitHub Desktop.
Save luciuschoi/0eec7191a9c5d45f0470f8b04a143c51 to your computer and use it in GitHub Desktop.

Soft Delete of Table Record

###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
.
.
.  
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment