【问题标题】:Hide records rather than delete them in ruby on rails 4.2.0在 ruby​​ on rails 4.2.0 中隐藏记录而不是删除它们
【发布时间】:2016-07-11 07:25:45
【问题描述】:

我想隐藏一些对账单的记录,而不是完全删除它们,以便在临时隐藏后检索相应的余额。

请参考以下截图以便更好地理解;

我将如何进行?

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

欢迎提出任何建议。

提前谢谢你。

【问题讨论】:

  • 可以添加布尔字段,点击删除后更新属性为真,在你的循环中只显示假记录
  • 感谢您的回复。我该怎么做呢?

标签: ruby-on-rails


【解决方案1】:

编辑:此答案无效,因为它假定 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 忽略查询的默认范围)。

【讨论】:

  • 感谢您的回复。为了您的友好信息,我不想删除任何记录,而是暂时将它们从计算中删除并在同一位置重新恢复。
  • 您能详细说明一下吗?你想做什么?
  • 谢谢。实际上,在屏幕截图中,我明确突出显示了包含 inv #7072 的一行,我想把它拿走并找到没有 inv #7072 的余额,我又必须像以前一样离开它。
  • 是的,非常清楚。你想让“带走”在数据库中持续一个小时或几天或类似的东西吗?还是在计算余额时忽略它(即在一个查询中)?
  • 谢谢。是的,在计算余额时忽略它(即在一个查询中)?
【解决方案2】:

以下是添加隐藏字段的实用帮助:

在控制台中输入以下内容来添加迁移:

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

您还必须在调用销毁操作时将 hidden 属性设置为 true。 在您的 xvaziris_controller.rb 中更改销毁方法:

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 中添加一个“显示全部”按钮:

<%= 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

【讨论】:

  • 感谢回复。我已经添加控制器代码
  • 我已经添加了进一步的解释
  • 这对您的问题有帮助吗?
  • 感谢您的回复。我只想在计算余额时忽略相应的发票并再次将其带回同一位置(即在一个查询中)或任何其他方式?你的解决方案是不是也一样?
  • 您是否希望在余额计算中考虑隐藏的发票?
【解决方案3】:

您可以引入新字段hidden,默认为false,这样您现有的所有数据都会显示出来。然后对于您要隐藏的每条记录,将此字段(标志)设置为true

实施您的平衡方法以包括或排除隐藏记录。

【讨论】:

  • 感谢您的回复。我是新手,能否详细解释一下?
  • 我只想在计算余额时(即在一个查询中)或以任何其他方式忽略发票金额?我引入了默认为 false 的新字段 hidden,但是对于每条记录,我如何隐藏并将该字段(标志)设置为 true?希望你明白这件事。
  • Nermin 先生,希望你做得很好!我尝试了其他编码,但没有得到结果。如何继续获得所需的结果。请指导..
  • Nermin 先生,我将等待您的出色解决方案。
  • 我最想要了。
【解决方案4】:

通过这个link

还有一个 gem act-as-paranoid 做同样的事情

【讨论】:

  • 但是由于我只有一个模型,我该如何处理我的数据?
猜你喜欢
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多