gpt4 book ai didi

ruby-on-rails - Rails default_scope 被应用于更新

转载 作者:数据小太阳 更新时间:2023-10-29 08:33:04 26 4
gpt4 key购买 nike

我在 rails 中使用 default_scope 来抽取任何具有 is_deleted = true 值的东西(任何具有这个值的东西都不应该显示,但我仍然想保留数据库中的行)。但是有一个 Controller 操作实际上应该取消删除某些内容(设置 is_deleted = false),但它失败了,因为正在应用 default_scope。据我了解,default_scope 仅在选择/创建记录时应用,但在更新时不应用(来源:http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html)。

The default_scope is also applied while creating/building a record. It is not applied while updating a record.

我知道我可以使用 .unscoped 方法,但这似乎有悖常理。我误解了文档吗?

app/models/post.rb

class Post < ActiveRecord::Base
default_scope where(:is_deleted => false)

app/controllers/posts_controller.rb

class PostsController < ApplicationController
def undelete
@post = Post.update(params[:id], :is_deleted => false)
render :action => :success if @post.save
end

错误

Couldn't find Post with id=1 [WHERE "posts"."is_deleted" = 'f']

最佳答案

您提到的文档中的行(在创建/构建记录时也应用了 default_scope。在更新记录时不应用它。)- 表示 default_scope 属性应用于所有模型 build /创造:

在您的情况下,所有新记录都将 is_deleted 属性设置为 false

但是在更新时,如果您从数据库中获取记录,更改一个属性(例如 title),然后调用 save - is_deleted 属性不会被强制为 false,因为它在创建时发生。

但是您使用的 update 方法 ( you can check it here ) 只是在内部使用 find,它始终使用 default_scope

解决方案就是使用unscoped 方法

class PostsController < ApplicationController
def undelete
@post = Post.unscoped.update(params[:id], :is_deleted => false)
render :action => :success if @post.save
end

关于ruby-on-rails - Rails default_scope 被应用于更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13937754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com