簡體   English   中英

隱藏記錄而不是在rails 4.2.0上的ruby中刪除它們

[英]Hide records rather than delete them in ruby on rails 4.2.0

我想隱藏聲明的一些記錄,而不是完全刪除它們,以便在臨時隱藏后檢索相應的余額。

請參閱屏幕截圖以獲得更好的理解,如下所示;

screenshot.png

我該怎么辦?

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

任何建議都是最受歡迎的。

先感謝您。

編輯:此答案無效,因為它假定OP想要永久存檔記錄。

使用范圍

  1. 以通常的方式添加archived到您的表的新字段。 我猜你知道怎么做。
  2. 不要刪除行,而是設置some_xvaziri.archived=true來標記您不想再顯示的記錄。
  3. 在您的模型中,添加“默認范圍”(請參閱http://apidock.com/rails/ActiveRecord/Base/default_scope/class

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

    這將從所有rails查詢中刪除這些記錄(除非您明確告訴rails忽略查詢的默認范圍)。

這是添加隱藏字段的實用幫助:

在控制台中輸入以下內容添加遷移:

rails g migration AddHiddenToXvaziris hidden:boolean

打開生成的遷移文件並更改以下行:

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

保存文件並運行遷移:

rake db:migrate

然后你必須檢查hidden-attribute是否為false,並且只有在hidden為false時才向@xvaziris添加一行。 xvaziris_controller.rb中,只需更改索引方法,如下所示:

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

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

調用destroy操作時,還必須將hidden屬性設置為true。 在你的xvaziris_controller.rb中更改destroy方法:

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

請注意,元素現在不會被銷毀,但設置為hidden == true。 如果你想在其他地方銷毀元素,我建議保留destroy方法,並在你的 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

執行此操作時,您還必須在路線中添加以下行:

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

您可以根據需要自定義路線以滿足您的需求。


要再次顯示隱藏的元素,我建議您執行以下操作:在index.html.erb中添加“全部顯示”-Button:

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

然后你必須添加routes.rb這一行:

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

在此方法的xvaziris_controller.rb中:

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

您可以引入hidden新字段,默認為false ,因此將顯示所有現有數據。 然后,對於要隱藏的每個記錄,將此字段(標志)設置為true

實施平衡方法以包含或排除隱藏記錄。

瀏覽此鏈接

此外,還有這種寶石作為偏執狂做同樣的事情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM