なるようになるブログ

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

rails commit log流し読み(2015/02/25)

2015/02/25分のコミットです。

CHANGELOGにのったコミットは以下の通りです。

activerecord/CHANGELOG.md

actionview/CHANGELOG.md


Move back new_column_definition into TableDefinition

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

Allow limit option for MySQL bigint primary key support.で追加されたnew_column_definitionメソッドTableDefinitionクラス配下に移動しています。


Remove unused table

activerecord/test/schema/postgresql_specific_schema.rbの修正です。

使用していないpostgresql_xml_data_type tableの作成処理を削除しています。


rework disable_referential_integrity for PostgreSQL. https://github.com/rails/rails/commit/72c1557254aef2bca8a72f16a4f67862c9cca5cb activerecord/lib/active_record/connection_adapters/postgresql/referential_integrity.rbの修正です。

disable_referential_integrityが設定されていた場合の処理を修正しています。

  • DISABLE TRIGGER ALLが失敗した場合に、DISABLE TRIGGER USERは実行しないよう修正
  • ブロック実行中にActiveRecord::InvalidForeignKeyが発生した場合に、warningメッセージを表示するよう修正
  • DISABLE TRIGGER ALLが失敗した場合に、元のトランザクションを復元するよう修正

という対応のようです。


Make TestController available to all test classes

actionpack/test/controller/filters_test.rbの修正です。

FilterTestクラス配下にあったTestControllerクラスを外だしして、他のテストクラスからも使用出来るよう対応しています。


Use other controller instead of sharing the controller

actionpack/test/controller/filters_test.rbの修正です。

……と思ったら、TestControllerクラスをFilterTestクラス配下に戻しています。あれー。


activemodel: make .model_name json encodable

activemodel/lib/active_model/naming.rbの修正です。

as_jsonメソッドnameメソッドdelegateするよう対応しています。Class.model_namejsonエンコード出来るように、との事。


Fix mysql's schema.rb dumper so it does not include limit on emulated boolean tinyint(1) fields

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

schema.rbを出力する際、boolean型については、limit: 1オプションを設定するよう修正しています。


Merge pull request #18744 from mfazekas/no-table-name-with-from

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

fromメソッドの引数にサブクエリーを指定し、かつ、そのサブクエリー内にgroupが指定されていた場合に、結果がおかしくなるバグがあったのを修正しています。

issueより。

avg_by_users = Score.
      group(:user_id).
      select('AVG(scores.score) as avg_score', 'scores.user_id AS user_id')
avg = Score.
      from(avg_by_users,'avg_by_user').
      group('user_id').
      select('AVG(avg_score) AS avg_score')
avg.to_a
# => no such column: scores.user_id: SELECT AVG(avg_score) AS avg_score FROM (SELECT AVG(scores.score) as avg_score, scores.user_id AS user_id FROM "scores" GROUP BY "scores"."user_id") avg_by_user GROUP BY "scores"."user_id"

Fix c479480638508c20601af69ca46b5b606c2d5b4d to account for from_value -> from_clause in bdc5141652770fd227455681cde1f9899f55b0b9

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

arel_columnsメソッド内で参照する値に誤りがあったのを修正しています。(from_value -> from_clause.value)。直ぐ先のコミットで誤ってしまっていたのを修正しています。


Call attributes_for_update in _update_record w/ optimistic locking

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

Optimistic#_update_recordメソッドで、updateの処理を行う際、attributes_for_updatereadonlyのattributesを対象にしないよう修正しています。


Tiny documentation edits [ci skip]

activerecord/lib/active_record/associations.rbactiverecord/lib/active_record/connection_adapters/abstract/schema_statements.rb guides/source/association_basics.mdの修正です。

不要な空行の削除、1行80文字で収まるよう改行の追加、等を行っています。


Add a failing test demonstrating regression with HEAD requests to Rack apps, re #18764

actionpack/test/dispatch/routing_test.rbの修正です。

先日、HEADリクエストのroutesを検索する際、routesのverbが//になっているものを削除するよう修正されたのですが、HEAD メソッドを使用した場合にせ正常な値を返す事を確認するテストが漏れていたので、追加しています。


AR: translate_exception_class() no longer logs error.

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

AbstractAdapter#translate_exception_classメソッドからログ出力処理を削除しています。

translate_exception_classメソッド自体が、ログ等の為にエラーの情報を整形する為のメソッドなので、そのメソッド内で更にログを出力する必要は無いのでは、という事で削除しています。


Add transaction callbacks that wont enroll to the transaction.

ActiveRecordの修正です。

ActiveRecord::Callbacksafter_commit_without_transaction_enrollmentafter_rollback_without_transaction_enrollmentを追加しています。

明示的にadd_transaction_recordが呼ばれないと実行されないcallbackのようです。

テストから抜粋。

  class TopicWithoutTransactionalEnrollmentCallbacks < ActiveRecord::Base
    self.table_name = :topics

    after_commit_without_transaction_enrollment { |r| r.history << :commit }
    after_rollback_without_transaction_enrollment { |r| r.history << :rollback }

    def history
      @history ||= []
    end
  end
@topic = TopicWithoutTransactionalEnrollmentCallbacks.create!
@topic.transaction do
    @topic.content = 'foo'
    @topic.save!
  end
  @topic.history #=> []
end
@topic = TopicWithoutTransactionalEnrollmentCallbacks.create!
@topic.transaction do
  2.times do
    @topic.content = 'foo'
    @topic.save!
  end
  @topic.class.connection.add_transaction_record(@topic)
end
@topic.history # => [:commit]

Add before_commit

ActiveRecordの修正です。

ActiveRecord::Callbacksbefore_commitを追加しています。after_commitは前からあったのですが、before_commitは無かったんですねえ。


Rename tests

activerecord/test/cases/transaction_callbacks_test.rbの修正です。

transaction callbackに関するテストのテスト名を、テスト内容に則した名前に修正しています。


Merge pull request #17426 from jpcody/fixture_associations_fix

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

has_manyメソッドthroughオプションを指定した場合に、fixturesが検索するテーブル名に、through先のテーブル名を使用するよう修正しています。


cache quoted column names in SQLite3

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

クオート処理をしたカラム名をキャッシュするよう修正しています。性能改善。


fix typo [ci-skip]

railties/lib/rails/paths.rbのdocの修正です。

Paths moduleのdoc内のタイポ(add -> adds)に修正しています。


update docs to reflect that mailer generator add suffix to generated classes [ci skip]

actionmailer/lib/action_mailer/base.rbのdocの修正です。

Rails 5では、mailer generatorが生成するクラスのサフィックスMailerを付与するようになっているのですが、doc内のexampleにその内容が反映されてなかったので、クラス名のサフィックスMailerを追加しています。


Fix dependency tracker bug

actionview/lib/action_view/dependency_tracker.rbの修正です。

renderpartiallayout両方を指定した場合に、dependency trackerが正しく動作していなかったバグがあったのを修正しています。


Merge pull request #18948 from kaspth/automatic-collection-caching

multi_fetch_fragmentsという、部分テンプレートで使用しているコレクションの表示とキャッシュを高速に行う事が出来るようになるgemがあるのですが、そのgemの実装をrails本体にマージしています。

<%= render @notifications %>

# notifications/_notification
<% cache notification do %>
  <%= notification.name %>
<% end %>

上記のような使い方をしている場合に、自動で@notificationsをキャッシュしてくれるようです。

キャッシュしたく無い場合は、

<%= render @notifications, cache: false %>

上記のようにcache: falseオプションを設定すればOKとの事です。