rails 使用default_scope遇到的问题以及解决方案
1.使用default_scope
1 | 2 . 1 . 1 : 001 > Post.all Post Load ( 0 .2ms) SELECT "posts" .* FROM "posts" WHERE "posts" . "published" = 1 |
2.使用default_scope需要小心的问题
一、
1 2 | 2 . 1 . 1 : 004 > Post. new => #<Post id: nil, title: nil, published: true, created_at: nil, updated_at: nil> |
二、
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 ]] |
三、使用假删除的时候,要注意unscoped的使用,unscope 会取消所有的scope, 包括deleted_at
3. 取消default scope unscoped的使用
1 2 3 4 5 6 | class User < ActiveRecord::Base default_scope { where tester: false } scope :testers , -> { unscope( :where ).where tester: true } scope :with_testers , -> { unscope( :where ).where tester: [ true , false ] } # ... endeg:Foo.unscope(where: :bar )orscope :not_default , -> { unscope(where: :bar ) }Foo.not_default |
It is currently possible to unscope
stuff like: :where,:select, :group, :order, :lock, :limit, :offset, :joins, :includes, :from, :readonly, :having
.
But still please avoid using of default_scope
if you can. It's for your own good.
参考链接:
https://stackoverflow.com/questions/1834159/overriding-a-rails-default-scope
https://www.thinbug.com/q/25087336
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话