1. ActiveRecord :: Relation # pick
Before Rails 6 Pluck was used to retrieve an array of attribute values when querying, reducing the looping step through each element in the ActiveRecord array.
Pluck.first will retrieve the first element of the array.
1 2 3 4 5 6 7 | <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">limit</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pluck</span> <span class="token punctuation">(</span> <span class="token symbol">:name</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> first <span class="token comment"># SELECT "users"."name" FROM "users" LIMIT ? [["LIMIT", 1]]</span> <span class="token comment"># => "David"</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">where</span> <span class="token punctuation">(</span> id <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pluck</span> <span class="token punctuation">(</span> <span class="token symbol">:name</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> first <span class="token comment"># SELECT "users"."name" FROM "users" WHERE "users"."id" = $1</span> <span class="token comment"># => "David"</span> |
Rails 6 Pick is used instead of Pluck.first with the purpose of retrieving the first element of the array
1 2 3 4 5 6 7 8 | <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">pick</span> <span class="token punctuation">(</span> <span class="token symbol">:name</span> <span class="token punctuation">)</span> <span class="token comment"># SELECT "users"."name" FROM "users" LIMIT ? [["LIMIT", 1]]</span> <span class="token comment"># => "David"</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">where</span> <span class="token punctuation">(</span> id <span class="token punctuation">:</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">pick</span> <span class="token punctuation">(</span> <span class="token symbol">:name</span> <span class="token punctuation">,</span> <span class="token symbol">:city</span> <span class="token punctuation">)</span> <span class="token comment"># SELECT "users"."name", "users"."city" FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]]</span> <span class="token comment"># => ["Naiya", "Goa"]</span> |
2. ActiveRecord :: Base.create_or_find_by /!
create_or_find_by rails 6 is a method instead of find_or_create_by when it changes the order from select-> insert to insert-> select to avoid race condition when using find_or_create_by in applications that need high scale.
If a record already exists with unique constraints, an exception will be raised like using find_by. Suppose there are 2 tables with constraints as follows
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">class</span> <span class="token class-name">CreatePosts</span> <span class="token operator"><</span> <span class="token constant">ActiveRecord</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Migration</span> <span class="token punctuation">[</span> <span class="token number">6.0</span> <span class="token punctuation">]</span> <span class="token keyword">def</span> change create_table <span class="token symbol">:posts</span> <span class="token keyword">do</span> <span class="token operator">|</span> t <span class="token operator">|</span> t <span class="token punctuation">.</span> string <span class="token symbol">:title</span> <span class="token punctuation">,</span> index <span class="token punctuation">:</span> <span class="token punctuation">{</span> unique <span class="token punctuation">:</span> <span class="token keyword">true</span> <span class="token punctuation">}</span> t <span class="token punctuation">.</span> timestamps <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">end</span> |
1 2 3 4 | <span class="token keyword">class</span> <span class="token class-name">Post</span> <span class="token operator"><</span> <span class="token constant">ApplicationRecord</span> validates <span class="token symbol">:title</span> <span class="token punctuation">,</span> presence <span class="token punctuation">:</span> <span class="token keyword">true</span> <span class="token keyword">end</span> |
Use create_or_find_by
Raise exception with create_or_find_by!
3. Enum
Enum is heavily used to name scopes. In Rails 6 to name the scope with the meaning of removing negative we can use not_ *
1 2 3 4 5 6 7 8 | <span class="token keyword">class</span> <span class="token class-name">Feed</span> <span class="token operator"><</span> <span class="token constant">ActiveRecord</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Base</span> enum status <span class="token punctuation">:</span> <span class="token string">%i[ active pending trashed ]</span> <span class="token keyword">end</span> <span class="token constant">Feed</span> <span class="token punctuation">.</span> not_active <span class="token comment"># => where.not(status: :active)</span> <span class="token constant">Feed</span> <span class="token punctuation">.</span> not_pending <span class="token comment"># => where.not(status: :pending)</span> <span class="token constant">Feed</span> <span class="token punctuation">.</span> not_trashed <span class="token comment"># => where.not(status: :trashed)</span> |
4. update_columns
update_columns in Rails are used to update records without ignoring the condition (validate) of the property.
Rails 6 when using update_columns for a property that does not exist will raise an ActiveModel :: MissingAttributeError .
In rails 4 or rails 5 versions, in this case, raise raised error ActiveRecord :: StatementInvalid
1 2 3 4 5 6 7 8 9 | <span class="token comment"># Rails 6</span> <span class="token operator">></span> <span class="token constant">User</span> <span class="token punctuation">.</span> first <span class="token punctuation">.</span> <span class="token function">update_columns</span> <span class="token punctuation">(</span> office_email <span class="token punctuation">:</span> <span class="token string">' <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="dbb6b2af9bbcb6bab2b7f5b8b4b6">[email protected]</a> '</span> <span class="token punctuation">)</span> <span class="token constant">SELECT</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> <span class="token string">"users"</span> <span class="token constant">ORDER</span> <span class="token constant">BY</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token string">"id"</span> <span class="token constant">ASC</span> <span class="token constant">LIMIT</span> <span class="token operator">?</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"LIMIT"</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token constant">Traceback</span> <span class="token punctuation">(</span> most recent call last <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">:</span> from <span class="token punctuation">(</span> irb <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token constant">ActiveModel</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">MissingAttributeError</span> <span class="token punctuation">(</span> can't write unknown attribute `office_email` <span class="token punctuation">)</span> |
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token comment"># Rails 5.2</span> <span class="token operator">></span> <span class="token constant">User</span> <span class="token punctuation">.</span> first <span class="token punctuation">.</span> <span class="token function">update_columns</span> <span class="token punctuation">(</span> office_email <span class="token punctuation">:</span> <span class="token string">' <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="234e4a5763444e424a4f0d404c4e">[email protected]</a> '</span> <span class="token punctuation">)</span> <span class="token constant">SELECT</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> <span class="token string">"users"</span> <span class="token constant">ORDER</span> <span class="token constant">BY</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token string">"id"</span> <span class="token constant">ASC</span> <span class="token constant">LIMIT</span> $ <span class="token number">1</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"LIMIT"</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token constant">UPDATE</span> <span class="token string">"users"</span> <span class="token constant">SET</span> <span class="token string">"office_email"</span> <span class="token operator">=</span> $ <span class="token number">1</span> <span class="token constant">WHERE</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token string">"id"</span> <span class="token operator">=</span> $ <span class="token number">2</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"office_email"</span> <span class="token punctuation">,</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="e08d8994a0878d81898cce838f8d">[email protected]</a> "</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">"id"</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token constant">Traceback</span> <span class="token punctuation">(</span> most recent call last <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">:</span> from <span class="token punctuation">(</span> irb <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token number">8</span> <span class="token constant">ActiveRecord</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">StatementInvalid</span> <span class="token punctuation">(</span> <span class="token constant">PG</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">UndefinedColumn</span> <span class="token punctuation">:</span> <span class="token constant">ERROR</span> <span class="token punctuation">:</span> column <span class="token string">"office_email"</span> of relation <span class="token string">"users"</span> does <span class="token keyword">not</span> exist <span class="token punctuation">)</span> <span class="token constant">LINE</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token constant">UPDATE</span> <span class="token string">"users"</span> <span class="token constant">SET</span> <span class="token string">"office_email"</span> <span class="token operator">=</span> $ <span class="token number">1</span> <span class="token constant">WHERE</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token string">"id"</span> <span class="token operator">=</span> $ <span class="token number">2</span> <span class="token operator">^</span> <span class="token punctuation">:</span> <span class="token constant">UPDATE</span> <span class="token string">"users"</span> <span class="token constant">SET</span> <span class="token string">"office_email"</span> <span class="token operator">=</span> $ <span class="token number">1</span> <span class="token constant">WHERE</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token string">"id"</span> <span class="token operator">=</span> $ <span class="token number">2</span> |
5. delete_by and destroy_by
Rails has find_or_create_by , find_by and similar methods to find the first value and create if a record cannot be found that matches the given parameters.
Rails lacks the same functionality to delete / cancel a conditional record, in previous Rails only supported destroy and delete_all methods to delete all records.
1 2 3 4 5 6 7 | <span class="token constant">S</span> ử dụng destroy và delete_all để xóa toàn bộ bản ghi phù hợp điều kiện cho trước <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find_by</span> <span class="token punctuation">(</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="c2afabb682a5afa3abaeeca1adaf">[email protected]</a> "</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> destroy <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">where</span> <span class="token punctuation">(</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="4c2125380c2b212d2520622f2321">[email protected]</a> "</span> <span class="token punctuation">,</span> rating <span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> destroy_all <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find_by</span> <span class="token punctuation">(</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="d1bcb8a591b6bcb0b8bdffb2bebc">[email protected]</a> "</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> delete <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">where</span> <span class="token punctuation">(</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="d4b9bda094b3b9b5bdb8fab7bbb9">[email protected]</a> "</span> <span class="token punctuation">,</span> rating <span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> delete_all |
Rails 6 added the deletion / destruction of a record found with a given condition with two methods: delete_by and destroy_by
1 2 3 4 | <span class="token constant">C</span> ú pháp <span class="token punctuation">:</span> model_name <span class="token punctuation">.</span> <span class="token function">delete_by</span> <span class="token punctuation">(</span> attr_name <span class="token punctuation">:</span> <span class="token string">'value'</span> <span class="token punctuation">)</span> model_name <span class="token punctuation">.</span> <span class="token function">destroy_by</span> <span class="token punctuation">(</span> attr_name <span class="token punctuation">:</span> <span class="token string">'value'</span> <span class="token punctuation">)</span> |
1 2 3 4 5 6 7 | <span class="token constant">S</span> ử dụng destroy_by và delete_by để xóa bản ghi phù hợp điều kiện cho trước <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">destroy_by</span> <span class="token punctuation">(</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="14797d60547379757d783a777b79">[email protected]</a> "</span> <span class="token punctuation">)</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">destroy_by</span> <span class="token punctuation">(</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="54393d20143339353d387a373b39">[email protected]</a> "</span> <span class="token punctuation">,</span> rating <span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">delete_by</span> <span class="token punctuation">(</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="3e53574a7e59535f5752105d5153">[email protected]</a> "</span> <span class="token punctuation">)</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">delete_by</span> <span class="token punctuation">(</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="f39e9a87b3949e929a9fdd909c9e">[email protected]</a> "</span> <span class="token punctuation">,</span> rating <span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">)</span> |
6. ActiveRecord :: Relation # touch_all
In Rails, the touch method is used to update the updated_at field from the default time to the current time. There is no validate and only after_touch, after_commit, and after_rollback callbacks are implemented.
Rails 6 has added the touch_all method in ActiveRecord :: Relation to touch multiple records at the same time.
Prior to Rails 6, it was necessary to iterate over all records using a iterator. The result will return an array of ActiveRecords.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token comment"># Rails 5.2</span> <span class="token operator">></span> <span class="token constant">User</span> <span class="token punctuation">.</span> count <span class="token constant">SELECT</span> <span class="token function">COUNT</span> <span class="token punctuation">(</span> <span class="token operator">*</span> <span class="token punctuation">)</span> <span class="token constant">FROM</span> <span class="token string">"users"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">3</span> <span class="token operator">></span> <span class="token constant">User</span> <span class="token punctuation">.</span> all <span class="token punctuation">.</span> touch_all <span class="token operator">=</span> <span class="token operator">></span> <span class="token constant">Traceback</span> <span class="token punctuation">(</span> most recent call last <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">:</span> from <span class="token punctuation">(</span> irb <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token number">2</span> <span class="token constant">NoMethodError</span> <span class="token punctuation">(</span> undefined method <span class="token string">'touch_all'</span> <span class="token keyword">for</span> <span class="token comment">#<User::ActiveRecord_Relation:0x00007fe6261f9c58>)</span> <span class="token operator">></span> <span class="token constant">User</span> <span class="token punctuation">.</span> all <span class="token punctuation">.</span> <span class="token keyword">each</span> <span class="token punctuation">(</span> <span class="token operator">&</span> <span class="token symbol">:touch</span> <span class="token punctuation">)</span> <span class="token constant">SELECT</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token operator">*</span> <span class="token constant">FROM</span> <span class="token string">"users"</span> <span class="token keyword">begin</span> transaction <span class="token constant">UPDATE</span> <span class="token string">"users"</span> <span class="token constant">SET</span> <span class="token string">"updated_at"</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token constant">WHERE</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token string">"id"</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"updated_at"</span> <span class="token punctuation">,</span> <span class="token string">"2019-04-20 16:23:31.388028"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">"id"</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> commit transaction <span class="token keyword">begin</span> transaction <span class="token constant">UPDATE</span> <span class="token string">"users"</span> <span class="token constant">SET</span> <span class="token string">"updated_at"</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token constant">WHERE</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token string">"id"</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"updated_at"</span> <span class="token punctuation">,</span> <span class="token string">"2019-04-20 16:23:31.418028"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">"id"</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> commit transaction <span class="token keyword">begin</span> transaction <span class="token constant">UPDATE</span> <span class="token string">"users"</span> <span class="token constant">SET</span> <span class="token string">"updated_at"</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token constant">WHERE</span> <span class="token string">"users"</span> <span class="token punctuation">.</span> <span class="token string">"id"</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"updated_at"</span> <span class="token punctuation">,</span> <span class="token string">"2019-04-20 16:23:31.518028"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">"id"</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> commit transaction <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token comment">#<User id: 1, name: "John", email: " <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="214b4e494f61464c40484d0f424e4c">[email protected]</a> ", rating: 2, created_at: "2019-04-10 16:09:29", updated_at: "2019-04-20 16:23:31">, #<User id: 2, name: "Marry", email: " <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="b4d9d5c6c6cdf4d3d9d5ddd89ad7dbd9">[email protected]</a> ", rating: 4, created_at: "2019-04-10 16:09:43", updated_at: "2019-04-20 16:23:31">, #<User id: 3, name: "Poll", email: " <a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="f3839c9f9fb3949e929a9fdd909c9e">[email protected]</a> ", rating: 4, created_at: "2019-04-10 16:09:45", updated_at: "2019-04-20 16:23:31">]</span> |
With Rails 6, the touch_all method will return the number of ActiveRecords
1 2 3 4 5 6 7 8 9 | <span class="token comment"># Rails 6</span> <span class="token operator">></span> <span class="token constant">User</span> <span class="token punctuation">.</span> count <span class="token constant">SELECT</span> <span class="token function">COUNT</span> <span class="token punctuation">(</span> <span class="token operator">*</span> <span class="token punctuation">)</span> <span class="token constant">FROM</span> <span class="token string">"users"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">3</span> <span class="token operator">></span> <span class="token constant">User</span> <span class="token punctuation">.</span> all <span class="token punctuation">.</span> touch_all <span class="token constant">UPDATE</span> <span class="token string">"users"</span> <span class="token constant">SET</span> <span class="token string">"updated_at"</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"updated_at"</span> <span class="token punctuation">,</span> <span class="token string">"2019-04-20 16:10:40.490507"</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">3</span> |
In addition, touch_all also takes custom_time or other parameters in the columns as in the example below
1 2 3 | <span class="token constant">User</span> <span class="token punctuation">.</span> all <span class="token punctuation">.</span> <span class="token function">touch_all</span> <span class="token punctuation">(</span> time <span class="token punctuation">:</span> <span class="token builtin">Time</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token number">2019</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">12</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token constant">User</span> <span class="token punctuation">.</span> all <span class="token punctuation">.</span> <span class="token function">touch_all</span> <span class="token punctuation">(</span> <span class="token symbol">:created_at</span> <span class="token punctuation">)</span> |
Thank you for watching here !!!
Reference Source: https://www.botreetechnologies.com/blog/notable-activerecord-changes-in-rails-6-part-1 https://www.botreetechnologies.com/blog/notable-activerecord-changes-in -rails-6-part-2