2/22(月)に開催された Sendagaya.rb #138 に参加して、
「ActiveRecod CHANGELOG」
を読んだのでその斜め読みのメモです!
🐝 foreign_key_exists?
migrationファイルで使えるメソッド。テーブルに外部キー制約が付いているかを確認する foreign_key_exists?
が追加。
# Check a foreign key exists |
アンチパターンにあるらしいから外部キー制約はちゃんと付け足ほうがいい。
🐞 Active Record::Base.suppress
class Comment < ActiveRecord::Base |
こんな風に Comment
を作成したら必ず Notification
を作るようなパターンはあるけど、
特定のパターンの場合は、Notification
を作成しないためには次のように記述する。
module Copyable |
とすると Notification.suppress
のブロックの中では、Notification
が作られなくなる。
🗻 Active Record::Base#accessed_fields
こんな感じのリファクタリングができるようになる。
class PostsController < ActionController::Base |
とすると :id, :title, :author_id, :updated_at
しか使わないので、
次のように書いて必要なカラムだけを取得するようにリファクタリングできる。
class PostsController < ActionController::Base |
😼 Active Record::Base.ignored_columns
ActiveRecord::Base.ignored_columns
でカラムを定義すると、Active Recordでは閲覧できないカラムを定義することができる。
おそらく、DBにあるけどもActiveRecodなどで参照してほしくないようなカラムを定義する。
🏈 Active Record::Relation#update
ActiveRecord::Relation#update
の動作が次のように変わったとのこと。
# Before: idとattriubutesを渡す形式だった。1SQLで実行できるけどcallbackが呼ばれない |
🐯 drop_テーブルのオプション :if_exists
migrationファイル内のオプションで :if_exists
を設定できるようになった。
drop_table(:posts, if_exists: true) |
🎂 Active Record::Relation#or
Post.where(‘id = 1’).or(Post.where(‘id = 2’)) を正確に解釈するようになりました
Post.where('id = 1').or(Post.where('id = 2')) |
Added #or to ActiveRecord::Relation by matthewd · Pull Request #16052 · rails/rails
🤔 Active Record::Relation#left_outer_joins(#left_joins)
外部結合のための #left_outer_joins(#left_joins)
が追加。
User.left_outer_joins(:posts) |
added ActiveRecord::Relation#outer_joins by Crunch09 · Pull Request #12071 · rails/rails
😎 findで与えたidsと同じ順序でActive Recordを返す
records = Topic.find([4,2,5]) |
🚜 after_commitのcallback名が変わった
#### Before #### |
🎉 Active Record::Relation#in_batches
People.in_batches(of: 100) do |people| |
ちなみにちょっとおもしろかったのはパフォーマンスです。 idを指定しつつ検索をしていく場合のほうが、OFFSETを使うよりも早いという結果になりました。
SELECT "posts"."id" FROM "posts" ORDER BY "posts"."id" ASC LIMIT 2 |
SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM "posts" LIMIT 2 OFFSET 0) subquery_for_count |
🍮 none? / one? の実装の変更
none?
や、 one?
の実装が改善。
# Before: |
🏀 belongs_toでアソシエーションがなければバリデーションエラー
belongs_to
でアソシエーションがなければ、バリデーションエラーになるようになった。optional: true
をつけるとエラーが出ないようになる。
🎃 Tips
以下は今回のCHANGE LOGとは直接は関係ない部分
(Tips) revertを使うとrollbackできる
migrationファイルの中で以下のようなことができる revert
というのがあるそう。何がうれしいかというとロールバックができるそう。
class FixupExampleMigration < ActiveRecord::Migration[5.0] |
Reverting Previous Migrations - Rails Guide
(Tips) RubyのEnumerable#any?
%w{ant bear cat}.any? {|word| word.length >= 3} #=> true |
(Tips) Active Record::Relation#any?
person.pets # => [# |
(Tips) define_attribute_methods
define_attribute_methods
を使うと次のようなことができる。
class Person |
DRYを実現するのに便利そう
ActiveModel::AttributeMethods で重複をなくす - Qiita
🗽 あとがき
CHANGELOGを集中して読んだり、いろんな人の意見を聞く機会っていなかなかなかので、本当にいい勉強になりました!
Sendagaya.rb #138 楽しかったです^^
🐹 参考リンク
- Rails 5.0で追加される主な新機能(Ruby on Rails公式ブログより) - Qiita
- A HUGE CHANGE RAILS 5 IS APPROACHING FAST
- A HUGE CHANGE RAILS 5 IS APPROACHING FAST