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

罗马

有什么区别:

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因此被广泛认为是邪恶的。

看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

rails中的:to和=>有什么区别

rails 中的 default_scope -> { keep } 是什么意思?

Rails中的ERB中的<%,<%=,<%#和-%>有什么区别?

在Rails中pluck和collect之间有什么区别?

<%=和rails中的“ puts”命令有什么区别?

Ruby on Rails 中的 Haml 和 Yaml 有什么区别?

Ruby on Rails 中的@user 和 user 有什么区别?

资源和Rails中的资源有什么区别?

带有default_scope的Rails update_counters错误

在Rails中,find_each和where和有什么区别?

重新定义所关注的default_scope(在Rails中)

Rails 4中的null_session和reset_session有什么区别?

在Rails中,response_to和response_with有什么区别?

Ruby on Rails中的Gemfile和Gemfile.lock有什么区别

在Ruby on Rails中,DateTime,Timestamp,Time和Date之间有什么区别?

rails中的t.belongs_to和t.references有什么区别?

在Rails中index.html和index.html.erb有什么区别?

Rails中的append_before_action和before_action有什么区别?

Rails中的public / assets和app / assets有什么区别?

Rails Controller中的“ env”和“ request.env”有什么区别?

Rails中的before_action和prepend_before_action有什么区别?

控制器和Rails中的动作之间有什么区别?

XPath中// * [*]和// * [。]有什么区别?

XPath中.//和// *有什么区别?

JavaScript中的&和&&有什么区别?

Haskell 中的 *> 和 >> 有什么区别?

Prolog中的:-和?-有什么区别?

“ ::”“。有什么区别?和C ++中的“->”

Elixir中==和===有什么区别?