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;
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.
archived
to your table in the usual way. I assume you know how to do that. some_xvaziri.archived=true
to flag the record(s) you do not want to show anymore. 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.