Rails 中的implicit_order_column 和default_scope 有什么区别?

2024-01-25

有什么区别:

self.implicit_order_column = 'id'

and

default_scope { order('id ASC') }

self.implicit_order_column允许您使用另一列,然后使用主键作为隐式排序列。这会影响方法的方式,例如.first and .last work:

User.class_eval do 
  self.implicit_order_column = 'created_at'
end

User.first
# => SELECT "users".* FROM "users" ORDER BY "users"."updated_at" ASC LIMIT $1  [["LIMIT", 1]]

User.last
# => SELECT "users".* FROM "users" ORDER BY "users"."updated_at" DESC LIMIT $1  [["LIMIT", 1]]

Setting self.implicit_order_column = 'id'完全没有意义,因为无论如何默认值都是主键列。这implicit_order_column如果您提供明确的命令,当然不会使用。它实际上并没有改变该类产生的任何其他作用域。

default_scope另一方面,将默认范围附加到您从类中生成的任何范围。

irb(main):001:0> User.all
   (0.5ms)  SELECT sqlite_version(*)
  User Load (0.1ms)  SELECT "users".* FROM "users" LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<User id: 1, role: "admin", created_at: "2020-11-08 19:31:31", updated_at: "2020-11-08 19:31:47">]>
irb(main):002:1* User.class_eval do
irb(main):003:1*   default_scope { order(id: :asc) }
irb(main):004:0> end
=> [#<Proc:0x00000000043703a8 (irb):3>]
irb(main):005:0> User.all
  User Load (0.2ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<User id: 1, role: "admin", created_at: "2020-11-08 19:31:31", updated_at: "2020-11-08 19:31:47">]>
irb(main):006:0> 

这里的差异并不是立即显而易见的。但是,如果您考虑到在 SQL 世界中,没有 order 子句的查询将不会按确定的顺序返回记录(取决于其实现),而这里我们实际上是按确定的顺序获取记录。在许多 RDBMS 中,结果很难区分,因为它们可能会按照修改的顺序返回记录(如果它们愿意的话)。

看起来很棒,直到你意识到多么不直观default_scope是什么以及它会导致多少错误。

irb(main):006:0> User.all.order(:created_at)
  User Load (0.2ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC, "users"."created_at" ASC LIMIT ?  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<User id: 1, role: "admin", created_at: "2020-11-08 19:31:31", updated_at: "2020-11-08 19:31:47">]>
irb(main):007:0>

或者这个例子:

irb(main):001:1* User.class_eval do
irb(main):002:1*   default_scope { where(admin: true) }
irb(main):003:0> end
=> [#<Proc:0x0000000002bde460 (irb):2>]
irb(main):004:0> User.new
   (0.6ms)  SELECT sqlite_version(*)
=> #<User id: nil, role: "visitor", created_at: nil, updated_at: nil, admin: true>

Yikes! default_scope因此被广泛认为是邪恶的。

See:

  • https://github.com/rails/rails/pull/34480 https://github.com/rails/rails/pull/34480
  • https://rails-bestpractices.com/posts/2013/06/15/default_scope-is-evil/ https://rails-bestpractices.com/posts/2013/06/15/default_scope-is-evil/
  • https://www.reddit.com/r/rails/comments/ha6gqj/default_scope_is_evil/ https://www.reddit.com/r/rails/comments/ha6gqj/default_scope_is_evil/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 中的implicit_order_column 和default_scope 有什么区别? 的相关文章

  • 如何让 Twilio 在hangup() 被触发时停止拨号?

    我一直在使用 twilio ruby gem 开发 Twilio 应用程序 但我陷入了一个部分 为呼叫构建 TwiML 响应 我拨打一些号码 以便他们也可以接听呼叫 def handle gather response Twilio Twi
  • 以 Rails 形式处理 MongoMapper EmbeddedDocument

    首先 我对一般编程和 Rails 都是新手 我选择 Rails 是因为它看起来是一种很容易上手的语言 对于我的项目 我将 MongoMapper 与 Rails 结合使用 我正在尝试以与文档相同的形式处理嵌入文档 我有以下模型 class
  • 装饰 Rails 中的属性

    我有一个name上的属性Person模型 每次我访问name属性 我想要name capitalize被退回 在模型内执行以下操作将不起作用 def name name capitalize end 那么还有什么选择呢 我建议您使用自定义格
  • Rails3 has_many 关系中子项计数的范围

    尝试在rails3中做一个范围 book has many chapters 我想要 range long 返回超过 10 章的书籍 如何最好地构建这个范围 不使用计数器缓存 thanks 这应该会让你继续 class Book scope
  • 可以通过 url 发送 JSON 吗?

    我有一个 ruby 哈希 其中键是 url 值是整数 我将哈希值转换为 JSON 我想知道是否能够通过 AJAX 请求在 url 内发送 JSON 然后从 params 哈希值中提取该 JSON 另外 我将把 JSON 化的 ruby 哈希
  • factory_girl + rspec 似乎并没有在每个示例后回滚更改

    类似于这里描述的问题 http rpheath com posts 411 how to use factory girl with rspec http rpheath com posts 411 how to use factory g
  • 随机显示 NoMethodError:未定义的方法“空?”对于 0:Fixnum

    它在我的本地计算机上运行良好 但使用 Puma Web 服务器在 Heroku 上的rails admin 中出现以下错误 这是我使用 enumerize 的方式 enumerize date type in last date 0 beg
  • 新 Rails 应用程序出现问题

    我刚刚创建了一个新的rails应用程序 在CL上 使用rails new 我使用的是4 2 6 但似乎在我对应用程序执行任何操作之前我遇到了错误 first config environments development rb 53 in
  • ActiveAdmin 注册页面和资源列表

    在使用ActiveAdmin register page and ActiveAdmin register 如何获取注册页面和资源的列表 假设您使用的是默认命名空间 admin 您可以对 ActiveAdmin 0 6 1 执行以下操作 r
  • Rails 4 中如何使用 attr_accessible?

    attr accessible似乎不再在我的模型中工作 Rails 4 中允许批量分配的方法是什么 Rails 4 现在使用参数强 http edgeapi rubyonrails org classes ActionController
  • 如何监听第三方应用程序触发的数据库更改

    我需要将 Ruby on Rails 应用程序与第 3 方应用程序集成 该应用程序将共享一个公共 PostgreSQL 数据库 也就是说 Rails 应用程序和第 3 方应用程序将使用相同的 PG 数据库 是否可以在 Rails 应用程序中
  • 实施单表继承后,Rails 路由损坏

    我已经为 person 类实现了单表继承 class Person lt ActiveRecord Base end class Teacher lt Person end class Student lt Person end class
  • RefineryCMS 2.1.0 和 Zurb 4 带有下拉导航的顶部菜单

    我正在尝试使用 Zurb Foundation 来设计使用最新版本的 Refinery 构建的应用程序 我开始遵循本指南 http blog flatironschool com post 54511602806 build a blog
  • 如何为每个数据库连接执行查询

    我目前正在执行以下操作 该操作有效但效率低下 因为它在每个操作之前调用它 class ApplicationController lt ActionController Base before action set intervalstyl
  • ruby on Rails“usr/bin/env:‘ruby2.3’:没有这样的文件或目录”

    我打字时遇到问题bundle exec rake db migrate在终端上 然后我收到了类似 usr bin env ruby2 3 No such file or directory 的结果 我遇到了同样的问题 但是运行时 rails
  • Rails:自动加载库不起作用

    由于某种原因我的自动加载器无法工作 我遵循了一些教程 这是我的 config application rb 文件的样子 require File expand path boot FILE require rails all Bundler
  • Devise + CanCan 只是阻止其他用户编辑对象

    您如何防止其他用户编辑对象 例如不属于自己的配置文件对象 大多数在线示例都是具有多个用户角色的复杂示例 我无法使其正常工作 但必须很简单 def initialize user can update Profile do profile p
  • 两种模型,一种是 STI,一种是验证

    假设我有两个表 产品和订单 为了简单起见 假设一次只能购买一种产品 因此没有像 order items 这样的连接表 所以关系是Product有很多订单 Order属于product 因此 product id是Order表中的一个fk 产
  • 将回形针 url 添加到 json

    通常在 html 中 我们会在图像标签内使用 Model field url thumb 如何在 json 上执行此操作 尤其是使用 hash secret 如果这对任何人都有帮助 我找到了一个很好的方法来做到这一点 class MyMod
  • 邪恶的pdf在两页上渲染最后一行

    我在用邪恶 pdf https github com mileszs wicked pdf生成 pdf 我面临的问题是 有时它会跨两页显示页面中的最后一行 如果 wicked pdf 无法容纳该页面中的整个行 或者对页面中的行数设置限制 有

随机推荐