gpt4 book ai didi

ruby-on-rails - Rails 中的 implicit_order_column 和 default_scope 有什么区别?

转载 作者:行者123 更新时间:2023-12-05 04:55:35 26 4
gpt4 key购买 nike

有什么区别:

self.implicit_order_column = 'id'

default_scope { order('id ASC') }

最佳答案

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

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]]

设置 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>

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

参见:

关于ruby-on-rails - Rails 中的 implicit_order_column 和 default_scope 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65378232/

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