我正在尝试通过添加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
,但我不确定它是否相关。
答案 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
这样的东西会起作用 - 除此之外,你可能想: