どうも、Gregです。 Railsのコードベースにあった最新の変更をお届けします。

Rails Worldのサイトが公開されました!
Rails Worldカンファレンスのウェブサイトが本日より公開されました。 こちらはRailsコミュニティの若手開発者のShona Chanにより製作されました。 Rails Foundationから委託されたもので、Katya Sitkoにより設計され、Ayush Newatiaの指導の下で製作されました。

Rails Worldのチケット販売が本日始まりました!
Rails Worldのチケット販売について、枚数限定のアーリーバードチケットを皮切りに、本日6月23日金曜日の中央ヨーロッパ夏時間午後5時に始まりました。 この機会をお見逃しなく、アムステルダムでお会いしましょう!

EncryptedConfigurationがハッシュらしく振る舞っていなかった点を修正
以前、キーがメソッドのように呼べるよう、EncryptedConfigurationInheritableOptionsを使用していました。 後にHashのように、そしてOrderedOptionsのように振る舞うように変更されました。 この2つ目の変更で意図せず#keys~#to_hといったメソッドが壊れてしまい、認証情報が設定されていたとしても、Rails.application.credentials.to_hが空のハッシュを返してしまっていました。 本プルリクエストではこの問題を修正しており、修正は7-0-stableにもバックポートされました。

複合主キーのhas_one関係でnullにする対応を追加
このプルリクエストが作成されたのは、has_one複合主キー (CPK) のdependent: :nullifyを伴う関係が壊れていたためです。 ActiveRecord::Associations::HasOneAssociationのnull化コードを変更し、外部キーカラムを巡回してモデルの主キーに属さない場合はnull化するようにしています。

idをActive Recordでの列挙値にすることを禁止
この変更ではidをActive Recordの列挙値として禁止しています。 これは、期待されていないジョインと副問い合わせを誘発しかねないからです。 それでも使いたい場合は\_prefixないし\_suffixオプションを設定すればできます。

可能な場合はAction TextがHTML5を使うよう更新
このプルリクエストは可能な場合にAction TextがHTML5サニタイザを使い、また可能な場合にNokogiri::HTML5を使ってマークアップを構文解析するよう更新しています。 これまで、Action Textはこうした操作にNokogiriのHTML4構文解析器を使っていました。

Rails.application.config#inspectsecret_key_baseを表示しないよう変更
Rails.application.config#inspectを呼び出すと全ての属性を表示していましたが、それにはsecret_key_baseも含まれていました。 本プルリクエストではinspectメソッドをオーバーライドしてクラス名のみ表示するようにしています。 これにより意図せず機密情報を出力してしまうことを避けるのに役立ちます。 同じ変更はMessageEncryptorEncryptedConfigurationでもなされています。

to_fsが無開端または無終端の範囲に対応
このプルリクエストはto_fsに無開端・無終端の範囲への対応を追加しています。 以下の例のような動作をします。

> (0..1).to_fs(:db)
=> "BETWEEN '0' AND '1'"
> (..1).to_fs(:db)
=> "< '1'"
> (0..).to_fs(:db)
=> "> '0'"

不具合修正:CPKの一部が変化した際にhas_one関係が必ず保存されるように変更
has_one関係が複合主キーを使っており、複合主キーの一部が所有者の元で変更された場合に、これらの変更は従属するオブジェクトの外部キーに反映される必要があります。 これは以前うまく動いていませんでした。 というのも#_record_changed?は複合主キーの関係を扱うように実装されていなかったためで、所有者の主キーが変更された際に、従属するオブジェクトの外部キーが更新されなければならないことを認識していなかったためです。

複合主キーのモデルを積極読み込み
このプルリクエストでは、モデルの積極読み込みと複合主キーとの関係を修正する上で、複合主キーを伴うノードを適切に扱うための依存代入のジョインを変更しています。

has_one関係を自動保存する際に_read_attributeを使用
このプルリクエストでは、複合主キーモデルの関係上の主キーが:idに設定された場合に、そのモデルが適切に自動保存されない問題を修正しています。

関係副問い合わせにスコープを適用
このプルリクエストでは関係(belongs_to/has_one/has_many)副問い合わせにスコープが適用されるようにするものです。 例えばhas_many :welcome_posts, -> { where(title: "welcome") }の関係があったとします。

以前:

Author.where(welcome_posts: Post.all)
#=> SELECT (...) WHERE "authors"."id" IN (SELECT "posts"."author_id" FROM "posts")

以降:

Author.where(welcome_posts: Post.all)
#=> SELECT (...) WHERE "authors"."id" IN (SELECT "posts"."author_id" FROM "posts" WHERE "posts"."title" = 'welcome')

変更の全一覧についてはこちらをご覧下さい
この1週間に21名の方々からRailsのコードベースに貢献していただきました!

また次回!

購読するとこうした更新をメールで受け取れます。