【问题标题】:Rails: Soft DeleteRails:软删除
【发布时间】:2019-05-20 12:57:27
【问题描述】:

我对 Rails 还很陌生。请问我需要一些帮助,我正在建立一个数字图书馆。

我希望将软删除选项添加到我的应用程序中。

现在我已经在我的表中添加了一个具有布尔数据类型的列 delete,并且我还在我的控制器中为 soft delete 定义了操作,但我面临在模型中定义软删除操作的范围的问题,以便可以在控制器中调用该操作。

我想要一个默认为 false 的软删除范围,然后当我删除一本书时,它会在数据库中更新为 true。

控制器动作

def softdelete
    @book.softdelete
    respond_to do |format|
      format.html { redirect_to books_url, notice: 'Book was successfully deleted.' }
      format.json { head :no_content }
    end
  end

软删除迁移

class AddDeleteToBooks < ActiveRecord::Migration[5.2]
  def change
    add_column :books, :delete, :boolean, :null =>  true
  end
end

剩下的就是如何在书本模型中定义软删除的方法。

我将不胜感激任何形式的帮助。谢谢。

【问题讨论】:

  • 我会考虑为此目的使用宝石,看看偏执狂或丢弃宝石。让您的生活更轻松。
  • 但我也会为此写一个简短的答案...

标签: ruby-on-rails named-scope


【解决方案1】:

你想做的是创建一个 softdelete 方法,更新删除字段(我认为你需要重命名它,因为它是 Rails 中的保留字)

class Book < ActiveRecord::Base
  #add a model scope to fetch only non-deleted records
  scope :not_deleted, -> { where(soft_deleted: false) }
  scope :deleted, -> { where(soft_deleted: true) }

  #create the soft delete method
  def soft_delete
    update(soft_deleted: true)
  end

  # make an undelete method
  def undelete
    update(soft_deleted: false)
  end
end

并更新您的控制器以从现在开始仅获取未删除的记录

 def index
   @books = Book.not_deleted
 end

【讨论】:

  • 如何定义书籍/soft_delete 的路径?我希望 soft_delete 操作将其表从 false 更新为 true。我已将路线定义为put '/soft_delete' =&gt; 'books#soft_delete' 但在视图上调用它&lt;%= link_to 'Soft Delete', book, data: { confirm: 'Are you sure?' } 似乎不起作用
  • 你不要......你只是使用默认的destroy路由......你只在模型对象上调用soft_delete方法而不是destroy。
  • 所以为了进一步澄清,你需要像标准的那样保持你的路由和控制器动作,但是你调用soft_delete而不是调用destroy。
  • YW,如果你回读我的 cmets,你会发现我多次指出了这一点。如果你不熟悉我使用的一些 Rails 术语,你应该谷歌搜索它们的定义。我认为任何具有良好 OOP / Rails 知识的人都会理解我的 cmets。另外,由于您的个人资料显示您很有天赋,我想您会理解的;)
  • 哈哈哈哈,天赋异禀
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多