Rails 4:self.update在模型中不起作用

时间:2013-09-11 19:58:52

标签: ruby-on-rails ruby ruby-on-rails-4

我正在尝试通过添加before_destroy回调来设置一个简单的软删除系统,该回调设置已删除的标志,然后返回false(以防止发生真正的破坏)。

class Project < ActiveRecord::Base

    belongs_to :user

    before_destroy :soft_delete

    def soft_delete
        self.update( is_deleted: 1 )
        false
    end

end

会导致记录更新。我不知道为什么。我在日志中看到[1m[36m (0.4ms)[0m [1mROLLBACK[0m,但我不确定它是否相关。

4 个答案:

答案 0 :(得分:3)

我猜self.update_columns(is_deleted: true)可能有用......

答案 1 :(得分:1)

here

  

如果before_ *回调返回false,则所有后来的回调和   相关操作已取消。如果after_ *回调返回false,   所有后来的回调都被取消了。回调通常在运行   它们的定义顺序,但定义为的回调除外   模型上的方法,最后称为。

答案 2 :(得分:1)

尝试 self.update_attributes(is_deleted: 1)

Rails 4.2.4

上为我工作

答案 3 :(得分:0)

我建议直接在控制器中覆盖destroy方法。与往常一样,尝试遵循rails的“Fat model skinny controller”的最佳实践。我在模型中制作了大部分逻辑,然后简单地从控制器中调用它:

在你的模特中:

def soft_delete!
    update_attribute(:is_deleted, 1)
    #remove any other attributes you want here (ie. if there are tasks associated with projects and such they should also be cascade "soft deleted here"
end 

在您的控制器中:

def destroy
   @project = Project.find(params[:id])
   @project.soft_delete!
   redirect_to projects_path
end

这样的东西会起作用 - 除此之外,你可能想:

  • 使soft_delete返回布尔值,以便您可以在控制器中打开它并重定向到其他位置
  • 软删除其他模型中的其他相关属性(我添加了注释)