简体   繁体   中英

Hide records rather than delete them in ruby on rails 4.2.0

I would like to hide some of the records of the statement rather than deleting them completely in order to retrieve the respective balance amount after the temporary hide.

Please refer the screenshot for better understanding as shown below;

screenshot.png

How would I proceed?

index.html.erb

<div class="row">

    <div class="col-md-10 col-md-offset-1">

        <div class="table-responsive myTable">

            <table id = "kola" class="table listing text-center">
                <tr class="tr-head">
                    <td>Date</td>
                    <td>Description</td>
                    <td>Amount</td>
                    <td>Discount</td>
                    <td>Paid</td>
                    <td>Balance</td>
                </tr>

                <tr>
                    <td></td>
                </tr>


                <a href="#" class="toggle-formed" style="float: right;" >Search</a>

                <div id="sample">

                    <%= form_tag xvaziris_path, remote: true, method: :get, class: "form-group", role: "search" do %>
                    <p>
                        <center><%= text_field_tag :search, params[:search], placeholder: "Search for.....", autofocus: true, class: "form-control-search" %>
                            <%= submit_tag "Search", name: nil, class: "btn btn-md btn-primary" %></center>
                        </p>
                        <% end %><br>
                    </div>



                    <%= render @xvaziris %>

                </table>
            </div>
        </div>
    </div>

_xvaziri.html.erb

<tr   class="tr-<%= cycle('odd', 'even') %>">

    <td class="col-1"><%= xvaziri.date.strftime('%d/%m/%Y') %></td>
    <td class="col-3"><%= span_with_possibly_red_color xvaziri.description %></td>


    <td class="col-1"><%= number_with_precision(xvaziri.amount, :delimiter => ",", :precision => 2) %></td>

    <td class="col-1 neg"><%= number_with_precision(xvaziri.discount, :delimiter => ",", :precision => 2) %></td>

    <td class="col-1 neg"><%= number_with_precision(xvaziri.paid, :delimiter => ",", :precision => 2) %></td>


    <% @balance += xvaziri.amount.to_f - xvaziri.discount.to_f - xvaziri.paid.to_f %>

    <% color = @balance >= 0 ? "pos" : "neg" %>

    <td class="col-1 <%= color %>"><%= number_with_precision(@balance.abs, :delimiter => ",", :precision => 2) %></td>

</tr>

xvaziri.rb

class Xvaziri < ActiveRecord::Base

    def to_s
        description
    end

    def self.import(file)
        CSV.foreach(file.path, headers: true) do |row|
            Xvaziri.create! row.to_hash
        end
    end


    def self.search(search)

        where (["description LIKE ? OR amount LIKE ? OR paid LIKE ?", "%#{search}%","%#{search}%","%#{search}%"]) 

    end

end

20151128091020_create_xvaziris.rb

class CreateXvaziris < ActiveRecord::Migration
    def change
        create_table :xvaziris do |t|
            t.date :date
            t.text :description
            t.decimal :amount
            t.decimal :discount
            t.decimal :paid
            t.decimal :balance
            t.timestamps null: false
        end
    end
end

xvaziris_controller.rb

class XvazirisController < ApplicationController

    before_action :set_xvaziri, only: [:show, :edit, :update, :destroy]

     layout "fedena"


    def index
        @xvaziris = Xvaziri.search(params[:search])


        respond_to do |format|
            format.js
            format.html 
        end 
    end

    def import
        Xvaziri.import(params[:file])
        redirect_to xvaziris_url, notice: "Xvaziris imported."
    end

    def show
    end

    def new
        @xvaziri = Xvaziri.new
    end

    def create
        @xvaziri = Xvaziri.new(xvaziri)
        if
            @xvaziri.save
            flash[:notice] = 'Xvaziri Created'
            redirect_to @xvaziri
        else
            render 'new'
        end
    end

    def edit
    end

    def update
        if @xvaziri.update(xvaziri)
            flash[:notice] = 'Xvaziri Updated'
            redirect_to @xvaziri
        else
            render 'edit'
        end

    end

    def destroy
        @xvaziri.destroy
        flash[:notice] = 'Xvaziri was successfully destroyed.'
        redirect_to xvaziris_url    
    end

    private
    # Use callbacks to share common setup or constraints between actions.
    def set_xvaziri
        @xvaziri = Xvaziri.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def xvaziri
        params.require(:xvaziri).permit(:date, :description, :amount, :discount, :paid)
    end

end

Any suggestions are most welcome.

Thank you in advance.

EDIT: This answer is invalid as it assumes that the OP wants to permanently archive records.

Use scopes

  1. Add a new field archived to your table in the usual way. I assume you know how to do that.
  2. Instead of deleting rows, set some_xvaziri.archived=true to flag the record(s) you do not want to show anymore.
  3. In your model, add a "default scope" (see http://apidock.com/rails/ActiveRecord/Base/default_scope/class )

     class Xvaziri < ActiveRecord::Base default_scope { where(:archived => false) } end 

    This will remove those records from all rails queries (unless you explicitely tell rails to ignore the default scope for a query).

Here's a practical help for adding the hidden field:

Add a migration with typing this in your console:

rails g migration AddHiddenToXvaziris hidden:boolean

Open the generated migration file and change the following line:

add_column :xvaziris, :hidden, :boolean, :default => false

Save the file und run the migration:

rake db:migrate

Then you have to check whether the hidden-attribute is false and add a row to @xvaziris only if hidden is false. In your xvaziris_controller.rb simply change the index method like this:

def index
    @xvaziris = Xvaziri.find_by hidden: false
    @xvaziris = @xvaziri.search(params[:search])

    respond_to do |format|
        format.js
        format.html 
    end 
end

You also have to set the hidden attribute to true when the destroy action is called. in your xvaziris_controller.rb change the destroy method:

def destroy
    @xvaziri = Xvaziri.find(params[:id])
    @xvaziri.hidden = true
    flash[:notice] = 'Xvaziri was successfully hidden.'
    redirect_to xvaziris_url    
end

Note, that elements aren't destroyed now, but are set to hidden == true. In case you want elements to be destroyed elsewhere, I recommend to leave the destroy method as it is and add a new method in your xvaziris_controller.rb:

def hide_xvaziri
    @xvaziri = Xvaziri.find(params[:id])
    @xvaziri.hidden = true
    flash[:notice] = 'Xvaziri was successfully hidden.'
    redirect_to xvaziris_url    
end

When you do so you also have to add the following line in your routes:

get '/xvaziri/:id/hide', to: 'xvaziris#hide_xvaziri'

You can customize the route, if you want, to fit your needs.


To show the hidden elements up again I recommend to do the following: Add a "Show all"-Button to your index.html.erb :

<%= link_to "Show all", resetfilter_xvaziri_path %>

Then you must add to you routes.rb this line:

get '/xvaziri/resetfilter', to: 'xvaziris#reset_filter'

In your xvaziris_controller.rb at this method:

def reset_filter
    xvaziris = Xvaziri.all // or do the search here, depending on what you need
    xvaziris.each do |xvaziri|
        xvaziri.hidden = false
    end
    redirect_to xvaziris_url
end

You can introduce new field hidden that is by default false , so all of your existing data will be shown. Then for every record you want to hide set this field(flag) to true .

Implement your methods for balance to include or exclude hidden records.

Go through this link

ALso there is this gem act-as-paranoid which does the same thing

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM