- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Everywhere on the互联网上的人提到使用 Rails default_scope
是一个坏主意,而 stackoverflow 上 default_scope
的热门话题是关于如何覆盖它。这感觉很困惑,值得一个明确的问题(我认为)。
那么:为什么不推荐使用rails default_scope
?
最佳答案
让我们考虑一下基本示例:
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
。因此,虽然您可能希望确保不会偶然列出未发布的帖子,但您现在默认创建已发布的帖子。
考虑一个更详细的示例:
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/
当运行 scala.util.Random().nextInt(3) 81 次时,我看到如下结果(Java 开发人员,请参阅 edit 了解这之间的关系): 200010202002112102222
在使用 native 应用程序在混合模式 C++/CLI 中调试时,我遇到了进程挂起问题。这是无法忍受的,我的调试几乎 70% 都会发生这种情况,我需要一次又一次地重新启动该过程。 是否有任何修补程序
我不知道这是一个错误还是某种误用/错误配置。希望有人能帮忙。谢谢! 如果我更改模块或 list 目录中的文件,通常会导致错误,大部分是以下类型 无法找到节点上的类 在节点上找不到定义类 当 Puppe
我是一名优秀的程序员,十分优秀!