gpt4 book ai didi

ruby-on-rails - 为什么经常建议不要使用rails default_scope?

转载 作者:行者123 更新时间:2023-12-03 04:35:39 25 4
gpt4 key购买 nike

Everywhere on the互联网上的人提到使用 Rails default_scope 是一个坏主意,而 stackoverflow 上 default_scope 的热门话题是关于如何覆盖它。这感觉很困惑,值得一个明确的问题(我认为)。

那么:为什么不推荐使用rails default_scope

最佳答案

问题 1

让我们考虑一下基本示例:

class Post < ActiveRecord::Base
default_scope { where(published: true) }
end

设置默认published: true的动机可能是确保您在想要显示未发布(私有(private))帖子时必须明确表示。到目前为止一切顺利。

2.1.1 :001 > Post.all
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't'

这几乎就是我们所期望的。现在让我们尝试一下:

2.1.1 :004 > Post.new
=> #<Post id: nil, title: nil, published: true, created_at: nil, updated_at: nil>

我们遇到了默认范围的第一个大问题:

=> default_scope will affect your model initialization

在此类模型的新创建实例中,将反射(reflect) default_scope。因此,虽然您可能希望确保不会偶然列出未发布的帖子,但您现在默认创建已发布的帖子。

问题2

考虑一个更详细的示例:

class Post < ActiveRecord::Base
default_scope { where(published: true) }
belongs_to :user
end

class User < ActiveRecord::Base
has_many :posts
end

让我们获取第一个用户的帖子:

2.1.1 :001 > User.first.posts
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't' AND "posts"."user_id" = ? [["user_id", 1]]

这看起来像预期的那样(确保一直滚动到右侧以查看有关 user_id 的部分)。

现在我们想要获取所有帖子的列表 - 包括未发布的帖子 - 比如登录用户的 View 。您会意识到必须“覆盖”或“撤消”default_scope 的效果。经过快速谷歌搜索后,您可能会发现unscoped。看看接下来会发生什么:

2.1.1 :002 > User.first.posts.unscoped
Post Load (0.2ms) SELECT "posts".* FROM "posts"

=> Unscoped 会删除通常适用于您的选择的所有范围,包括(但不限于)关联。

有多种方法可以覆盖 default_scope 的不同效果。正确执行此操作可获得 complicated很快,我认为首先不使用 default_scope 会是一个更安全的选择。

关于ruby-on-rails - 为什么经常建议不要使用rails default_scope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25087336/

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