なるようになるブログ

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

rails commit log流し読み(2019/01/31)

2019/01/31分のコミットです。

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

activerecord/CHANGELOG.md


Adds basic automatic database switching to Rails

Active Recordの修正です。

HTTP requestの種類に応じて自動で使用するconnectionをswitchする為のDatabaseSelector middlewareを追加しています。

このmiddlewareでは、HTTP requestがGET、または、HEADの場合に自動でreplica database connectionを使うようになっています。それ以外のrequestの場合はprimaryを使用します。

また、replicaに同期されるまでの時間を考慮し、最後のwrite処理から2秒以上経過した場合のみ、replicaのconnectionを使うようになっています。write処理から2秒未満の場合は、GET / HEAD requestの場合も、primary connectionが使用されるようになっています。最後のwrite処理の時間はsessionに値を保持するようになっており、その値と現在時間との比較でチェックが行われるようになっています。

この2秒という時間や、データを取得する先の決定処理(Resolver)や、write処理を保持する方法はconfigでカスタマイズ出来るようになっています。

config.active_record.database_selector = { delay: 2.seconds }
config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
config.active_record.database_operations = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session

上記がデフォルトの設定です。例えば、write処理の時間をsessionではなくcookieに保存したい場合、独自のoperator classを作成し、config.active_record.database_operationsにそのclassを指定すればOKです。


Merge pull request #35093 from rails/av-base-constructor

Action Viewの修正です。

ActionView::Baseクラスに、インスタンス生成用のbuilder methodを追加しています。

元々はActionView::Base.newで全てのケースを対応していたのですが、それにより処理が複雑になってしまっていた為、view pathを指定したい場合は、ActionView::Base.with_view_paths、contextを指定したい場合はActionView::Base.with_context、という風に、インスタンス生成時に指定したい値に合わせたbuildメソッドを提供するようにしていす。


activemodel typo fixes.

activemodel/lib/active_model/validations/length.rbactivemodel/test/cases/validations/numericality_validation_test.rbの修正です。

テスト名、及び、エラーメッセージ内のタイポを修正しています。


Write update_last_write_timestamp after request

activerecord/lib/active_record/middleware/database_selector/resolver.rbの修正です。

DatabaseSelector::Resolver#write_to_primaryメソッドで、最後のwrite時間の記録をrequest処理の前にやっていたのを、request処理の後に行うよう修正しています。

request処理の前に時間を記録してしまうと、request処理に時間が掛かった場合にrepliaへの遅延待ち時間の意味が無くなってしまう(例えばrequest処理に5秒掛かった場合、遅延待ちをまたずreplicaからデータの取得が行われてしまう)為。


Merge pull request #34980 from y-yagi/fixes_34979

railties/lib/rails/generators/actions.rbの修正です。

generate action実行時に、不要なRAILS_ENV=xxxがgeneratorの引数と渡されてしまう、というバグがあったのを修正しています。


Fix ERB.new argument deprecated warning

railties/test/generators/generators_test_helper.rbの修正です。

Ruby 2.6以上ではERB.newの引数にキーワード引数を使用するよう修正しています。


Remove redundant begin block

activerecord/lib/active_record/middleware/database_selector/resolver.rbの修正です。

DatabaseSelector::Resolver#write_to_primaryメソッドから不要なblockを削除しています。


Fixed typo for DatabaseSelector::Resolver documentation

activerecord/lib/active_record/middleware/database_selector/resolver.rbのdocの修正です。

inheritsinhertsにタイポしていたのを修正しています。


ActiveRecord typo fixe.

activerecord/lib/active_record/middleware/database_selector.rbのdocの修正です。

multiplemutlipleにタイポしていたのを修正しています。


ActiveStorage typo fix.

activestorage/lib/active_storage/previewer/poppler_pdf_previewer.rbのdocの修正です。

dimensionsdimesionsにタイポしていたのを修正しています。