Ruby on rails Rails 4:self.update在模型内部不工作
我试图建立一个简单的软删除系统,方法是在destroy之前添加一个Ruby on rails Rails 4:self.update在模型内部不工作,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我试图建立一个简单的软删除系统,方法是在destroy之前添加一个回调,该回调设置deleted标志,然后返回false(以防止真正的destroy发生) class项目
回调,该回调设置deleted标志,然后返回false(以防止真正的destroy发生)
class项目
这不会导致记录得到更新。我不知道为什么。我在日志中看到了[1m[36m(0.4ms)[0m[1m回滚[0m
,但我不确定它是否相关。看
如果before_*回调返回false,则所有后面的回调和
关联的操作被取消。如果after_*回调返回false,
所有后面的回调都被取消。回调通常在
它们被定义的顺序,除了定义为
模型上的方法,这些方法最后调用
看
如果before_*回调返回false,则所有后面的回调和
关联的操作被取消。如果after_*回调返回false,
所有后面的回调都被取消。回调通常在
它们被定义的顺序,除了定义为
模型上的方法,这些方法最后调用
我想,self.update\u columns(is\u deleted:true)
可能有效…我想,self.update\u columns(is\u deleted:true)
可能有效…我建议直接在控制器中重写destroy方法。一如既往,尝试遵循rails的最佳实践“胖型瘦控制器”.我会在模型中创建大部分逻辑,然后简单地从控制器调用它,如下所示:
在您的模型中:
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返回布尔值,以便您可以在控制器中打开它并重定向到其他位置
- 软删除其他模型中的其他相关属性(我在其中添加了注释)
我建议直接在控制器中重写destroy方法。一如既往,尝试遵循rails“胖模型瘦控制器”的最佳实践。我将在模型中创建大部分逻辑,然后从控制器中简单地调用它,如下所示:
在您的模型中:
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返回布尔值,以便您可以在控制器中打开它并重定向到其他位置
- 软删除其他模型中的其他相关属性(我在其中添加了注释)
试试看
self.update\u属性(已删除:1)
在Rails 4.2.4上为我工作
self.update\u属性(已删除:1)
在Rails 4.2.4上为我工作过,所以我的策略不起作用,因为返回false
会撤消设置标志的更新。是吗?是的,它不会继续。我想你应该将逻辑移到你的控制器上。或者可能会搜索覆盖模型的destroy方法是否有什么好办法。所以我的策略egy将不起作用,因为返回false
会撤消设置标志的更新。是吗?是的,它不会继续。我想你应该将逻辑移到你的控制器上。或者可能会搜索覆盖模型的销毁方法是否有什么好处。从本质上说,我不认为使用before\u destroy是最好的实现方法基本上,我不认为使用“销毁前”是实现你想要的东西的最佳方式:)。