新特性:
https://weblog.rubyonrails.org/2020/12/9/Rails-6-1-0-release/
升级 6.1 可能最大的难点将是 Autoload mode 的变更,现在 zeitwerk
为默认的。如果你之前的项目的文件组织方式没有 Follow Rails 的约定,将会有困难。
config.autoload = :classic
是指这个?感觉还好吧,没有单个文件单个 class / module 习惯的同学可能要被自己坑咯。
Rails 6.1 form_with 的默认行为变成 local 了,remote form 需要指定 local: false。 https://twitter.com/chloerei/status/1338048528006844417
感觉这个有点坑。
bulk_insert 可以改用 insert_all
方法代替了,bulk_insert 更新太慢了,我的项目里面都去掉了
https://api.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-insert_all
https://github.com/ruby-china/homeland/commit/eb95fc9200889c435ea7bfff5b5accd1a5041427
Homeland 和 BlueDoc 升级 Rails 6.1 的 PR 大家有需要可以参考一下:
因为这两个项目测试覆盖率较高,所以基本上是直接
rails app:update
根据 Diff 更新默认的几个文件以后,再适当修正一下废弃 API 以及无法升级的 Gem
Rails 6.1 Activerecord 更新
https://github.com/rails/rails/blob/6-1-stable/activerecord/CHANGELOG.md
Named scope chain does no longer leak scope to class level querying methods.
class User < ActiveRecord::Base scope :david, -> { User.where(name: "David") } end
Before:
User.where(name: "John").david # SELECT * FROM users WHERE name = 'John' AND name = 'David'
After:
User.where(name: "John").david # SELECT * FROM users WHERE name = 'David'
where.not now generates NAND predicates instead of NOR. Before:
User.where.not(name: "Jon", role: "admin") # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
After:
User.where.not(name: "Jon", role: "admin") # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
以上两点,我看了一下 ruby-china 没有改相关的代码,怎么做到兼容的呢?
下面这一段没有完全看明白,如果这样的话, User.where(name: "John").david 的效果不是和 User.david 一样了吗?
Named scope chain does no longer leak scope to class level querying methods.
lass User < ActiveRecord::Base
scope :david, -> { User.where(name: "David") }
end
Before:
User.where(name: "John").david
# SELECT * FROM users WHERE name = 'John' AND name = 'David'
After:
User.where(name: "John").david
# SELECT * FROM users WHERE name = 'David'
原来那样同一个 name
字段二次过滤条件,明显是错误的逻辑,没人会这么查,因为 name
不可能同时是 John 和 David
这是修正了 Bug