なるようになるブログ

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

rails commit log流し読み(2014/04/14)

2014/04/14分のコミットです。

複数プロセスで処理を行った際に、counter_cacheが誤った値になるバグの修正が含まれています。


Merge pull request #14592 from laurocaetano/equality_between_relation_and_collection_proxy

RelationCollectionProxyを比較した際の結果を統一するようにしています。

author.posts == Post.where(author_id: author.id)
# => true
Post.where(author_id: author.id) == author.posts
# => false

上記のようになっていたのを、2つめについてもtrueになるように修正。activerecord/lib/active_record/association_relation.rb==メソッドを追加しています。


[ci skip] Improve doc, fix grammatical issue

rails guide及びコメントの修正。文法的に誤っている箇所を修正しています。


[ci skip] Use plain underscore instead of "_".

こちらもdocの修正。"_"を"_"に修正しています。元々エスケープとして"_"を指定していたように見えるんですが、はて、何故OKに。


Write the failing test case for concurrent counter cache

カウンターキャッシュのバグ修正。の、テストコード追加のコミットです。

SQLのDELETEは冪等性が保証されており、何度繰り返し実行しても、結果はいつも成功します。で、カウンターキャッシュは、DELETEが成功したらカウンターをデクリメントするようになっていた為、以下のシナリオの場合に問題がおきます。

  • Process 1 load the record
  • Process 2 load the record
  • Process 1 destroy the record
  • Process 2 destroy the record

Process1と2で同じレコードをloadしている場合、同じレコードをdestroy(delete)しているので、実際は1行しか削除されてないので、カウンターキャッシュ上は2回デクリメントされてしまう事になり、値が実際のレコードと異なってしまう、というバグです。

DELETEの成功/失敗ではなく、影響があった行数(affected_rows)を見るよう修正されています。


Make counter cache decrementation on destroy idempotent

上記カウンターキャッシュのバグ修正の、実際のコード修正です。


Disable assest cache store in docs [ci skip]

rails guideの修正です。assets cache storeを無効にする方法の説明を削除しています。


read_attribute is public, so we should just call it

read_attributeはパブリックメソッドで直接呼べるので、sendを削除しています。


again, read_attribute is public, so just call it

上記コミット同じです。類似箇所修正。


- Fix lingering reference to :text instead of the newer :plain

rails guideの修正です。任意の文字列を表示させたいとき、renderメソッドに:textオプションを指定していたのですが、今は:plainオプションの方が推奨なので、guideも:plainを使用するよう修正しています。


Just call read_attribute, no need to use send.

二つ上のコミットの、類似箇所修正。


docs, double meaning of serialize argument. Closes #14284.

activerecord/lib/active_record/attribute_methods/serialization.rbのコメント及び変数名の修正です。

serializeメソッドの第二引数には、class名、または.load / .dumpメソッドを実装したオブジェクトを指定する仕様になっていたのですが、せの説明が足りてなかたのを追加しています。

# Serialize preferences using JSON as coder.
class User < ActiveRecord::Base
  serialize :preferences, JSON
end

# Serialize preferences as Hash using YAML coder.
class User < ActiveRecord::Base
  serialize :preferences, Hash
end

こういうことか。


collection_check_boxes respects :index option for the hidden filed name.

collection_check_boxesのoptions引数にindexを指定した際に、hidden fieldにindexに指定された値が反映されていなかったのを修正。

バグ、というか機能拡張か。