なるようになるブログ

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

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

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

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

activerecord/CHANGELOG.md


Merge pull request #18769 from gsamokovarov/exception-wrapper-windows-paths

actionpack/lib/action_dispatch/middleware/exception_wrapper.rbの修正です。

エラーページでファイル名、行数を表示する際、traceを":"で分割していたのですが、 Windowsではドライブレターに":"が使われており、":"で分割してまうと正しいファイル名、行数が取得出来ないバグがあったのを修正しています。


Merge pull request #18721 from sj26/pre-discard-flash

actionpack/lib/action_controller/test_case.rbactionpack/lib/action_dispatch/middleware/flash.rbの修正です。

flash.discardを行った場合、画面上は表示されないものの、Flasクラスではdiscardした値を保持していました。

で、discardした値は保持している必要は無いのでは、という事でdiscardした値は保持しないよう修正しています。


Merge pull request #18756 from ajgrover/activejob_tests

Gemfileの修正です。

queue_classicのバージョンを"3.0.0"未満に固定していたのを、バージョン固定を削除しています。

queue_classic、もう3.0.3まで出ていたとの事です。


stop making calls to add_record

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

commit_transactionメソッドでtransactionにレコードを追加するのに、add_recordメソッドを使用していたのを削除し、add_to_transactionを使うよう修正しています。


remove conditional that is always true

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

add_to_transactionメソッドadd_transaction_recordがtrueの場合にremember_transaction_record_stateメソッドを呼び出す、という処理があったのですが、 add_transaction_recordが必ずtrueを返すため、条件分岐は不要との事で削除しています。


push add to transaction logic down to the instance

activerecord/lib/active_record/connection_adapters/abstract/transaction.rbactiverecord/lib/active_record/transactions.rbの修正です。

transaction objectのメソッドActiveRecordインスタンスがcallbacksメソッドが定義されてるかどうかチェックをしていたのを、ActiveRecord自身のメソッドでチェックを行うよう修正しています。


make the private methods private

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

set_transaction_statehas_transactional_callbacks?メソッドをprivate methodに変更しています。


Fix Issue #15549, unbounded memory growth when saving records that have any after_create callbacks (or any associations, which makes after_create callbacks for you)

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

after_create callbackが設定されているrecordのsave時に、大量のメモリを消費してしまうバグがあったのを修正しています。ユーザ定義のcallbackだけでなく、associationに関するcallbackでも対象のようです。詳細はPR参照


add destroyed records to the currend transaction

activerecord/lib/active_record/persistence.rbactiverecord/lib/active_record/transactions.rbの修正です。

transactionを行っているrecordの削除処理を追加しています。


Cache url_helpers

actionpack/lib/action_dispatch/routing/route_set.rbの修正です。

url_helpersメソッドで、一度取得したhelperの情報をインスタンス変数に保持し、次呼び出された場合はその保持した値を返すよう修正しています。

テスト等で頻繁にurl_helpersメソッド呼び出す場合に恩恵受けれそうですねえ。


Cache url_helpers separately for mailers

actionpack/lib/action_dispatch/routing/route_set.rbの修正です。

先ほどのurl_helpersのメモ化の対応で、引数(supports_path)に対するケアがたりてなかったので、supports_pathがtrue/falseそれぞれ毎に、違うインスタンス変数に保持するよう修正しています。

+        if supports_path
+          @url_helpers_with_paths ||= generate_url_helpers(supports_path)
+        else
+          @url_helpers_without_paths ||= generate_url_helpers(supports_path)
+        end

Fix validations on child record when record parent has validate: false

ActiveRecord / ActiveModelの修正です。

associationを使用している場合に、既に存在している子のレコードを親に指定して、親をsaveした場合に、 子の値が一切変更になってないにも関わらず、不要なvalidation処理が実行されてしまうバグがあったのを、 値が変更されてるかどうかチェックし、値の変更が無い場合は不要なvalidation処理は行わないよう修正しています。

issuより。

class Conversation < ActiveRecord::Base
  has_many :conversation_users
  has_many :users, through: :conversation_users
end

class ConversationUser < ActiveRecord::Base
  belongs_to :conversation
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :conversation_users
  has_many :conversations, through: :conversation_users
  validates :name, presence: true
end

class BugTest < Minitest::Test
  def test_conversation_with_valid_existing_user
    user = User.create!(name: "North Bieber")
    assert user.persisted?

    conversation = Conversation.new(user_ids: [user.id])
    conversation.save!

    assert_equal 1, conversation.users.count
    assert_equal [user], conversation.users
  end

  def test_conversation_with_invalid_existing_user
    user = User.new()
    user.save!(validate: false)
    assert user.persisted?

    # ここで"Validation failed: Users is invalid"が起きてしまう
    conversation = Conversation.new(user_ids: [user.id])
    conversation.save!

    assert_equal 1, conversation.users.count
    assert_equal [user], conversation.users
  end

end

Fix typo in Time#change docs

activesupport/lib/active_support/core_ext/time/calculations.rbのdocの修正です。

changeメソッド:nsecオプションの説明内の、"Path"を"Pass"に修正しています。