なるようになるブログ

読書感想文かrailsについてかrubyについてか

rails commit log流し読み(2017/09/08)

2017/09/08分のコミットです。

CHANGELOGへの追加はありませんでした。


Fix quote_default_expression for UUID with array default

activerecord/lib/active_record/connection_adapters/postgresql/quoting.rbの修正です。

PostgreSQLでmigrationにuuid型をArrayで使用している、かつ、デフォルト値を設定した場合(e.g. add_column :some_table, :some_column, :uuid, array: true, default: [])にmigration実行時にエラーになってしまうバグがあったのを修正しています。


Add an extra assertion to ensure dumping schema default as expected

activerecord/test/cases/adapters/postgresql/uuid_test.rbの修正です。

migrationにuuid型をArrayで使用している、かつ、デフォルト値を設定した場合のテストで、schemaファイルに期待通りのmigrationが出力される事を確認するテストを追加しています。


Remove unused primary_key_type and quoted_table_name in Reflection

activerecord/lib/active_record/reflection.rbの修正です。

ActiveRecord::Reflection moduleから、使用していないprimary_key_typeメソッドとquoted_table_nameメソッドを削除しています。


Remove duplicated klass method in AssociationReflection

activerecord/lib/active_record/reflection.rbの修正です。

AssociationReflection#klassメソッドを削除しています。親クラス(MacroReflection)にまったく同じ内容のメソッドがもうある為。


Do not install unused gem

Gemfileの修正です。

使用していないqu-redis gemをコメントアウトしています。

Active Jobのqu adapterのテスト用に入れていたのですが、qu adapterのテストは長い事動いておらず(qu gemがRails 5.1に対応していない為)、不要な為インストールしないようにしています。


Remove unnecessary join_type in AssociationScope

activerecord/lib/active_record/associations/association_scope.rbの修正です。

AssociationScope#join_typeメソッドを削除しています。

上記メソッドはAssociationScope#joinメソッドでtableのcreate_joinの引数として渡すよう使っており、Arel::Nodes::InnerJoinを返すようになっていたのですが、default join klassがArel::Nodes::InnerJoinになっており明示的に値を渡す必要がそもそも無い為、メソッドを削除し引数は指定しないようにしています。


Merge pull request #30524 from tgxworld/recover_plucK_performance

activerecord/lib/active_record/relation/query_methods.rbの修正です。

QueryMethods::WhereChain#default_value_forメソッドで値を返すのにcase / whenを使用していたのを、事前にHashを作成しておいて、そこから値をfetchするよう修正しています。

+      DEFAULT_VALUES = {
+        create_with: FROZEN_EMPTY_HASH,
+        readonly: false,
+        where: Relation::WhereClause.empty,
+        having: Relation::WhereClause.empty,
+        from: Relation::FromClause.empty
+      }
+
+      Relation::MULTI_VALUE_METHODS.each do |value|
+        DEFAULT_VALUES[value] ||= FROZEN_EMPTY_ARRAY
+      end
+
+      Relation::SINGLE_VALUE_METHODS.each do |value|
+        DEFAULT_VALUES[value] = nil if DEFAULT_VALUES[value].nil?
+      end
+
       def default_value_for(name)
-        case name
-        when :create_with
-          FROZEN_EMPTY_HASH
-        when :readonly
-          false
-        when :where, :having
-          Relation::WhereClause.empty
-        when :from
-          Relation::FromClause.empty
-        when *Relation::MULTI_VALUE_METHODS
-          FROZEN_EMPTY_ARRAY
-        when *Relation::SINGLE_VALUE_METHODS
-          nil
-        else
+        DEFAULT_VALUES.fetch(name) do
           raise ArgumentError, "unknown relation value #{name.inspect}"
         end

Rails 5系になってからpluckメソッドの性能が4系と比べて悪化しており、それを調べていた所case / whenのチェック処理(Symbol#===の呼び出し)で重くなっていたようだった為、上記の対応を行ったという事です。

ベンチマークの結果等はPRを参照。


Merge pull request #30536 from y-yagi/reorganize_secrets_test

railties/test/secrets_test.rbの修正です。

secretsのテストで、本来同時に使うべきではないabstract_unitisolation/abstract_unitを同時に使用していた為、isolation/abstract_unitだけを使用するようテストを整理しています。