Study further more

進捗出します

【Rails Code Reading 1回目】Add validate numericality in range #41022

今日からなんとなくやってみる。

github.com

rails/railsにmargeされたPRを軽く読み倒して、個人的な感想をまとめるやつ。

対象PR

github.com

今回はこれ。 ざっくり、ActiveModelのvalidationの1つである、numericalityに関するもの。 引数に、inをkeyとしてvalueがRangeオブジェクトのハッシュを渡すことで、Rangeのvalidatetionを可能にする機能の追加である

ざっくり

validates :percentage, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 100 }

と書く必要があったのを、

validates :percentage, numericality: {in: 0..100 }

とかけるようになるらしい。 確かにこれは便利である。

実装方針

どうやっているか。 どうやら、ActiveModelをいじっている。Modelのバリデーション絡みの実装だから当たり前か。

NumericalityValidator:: CHECKSin: :in?が追加実装されている。 むー。

https://github.com/mpapis/rails/blob/2486e887deac01988ba49932c16d345e2a6dd434/activemodel/lib/active_model/validations/numericality.rb#L70

あたりも色々触られている。

NumericalityValidator.check_validity!で引数の型チェックみたいなことをしている。 では、ActiveModelのバリデーションのメインの実装はどこだ。 おそらく、validate_eachメソッドっぽい。 この中身は、ほとんど実装が変わっていないが、たったこれだけでバリデーションが追加できるのか。 ActiveModelのライブラリとしての完成度の高さを伺えた。

あとでもう少し詳しく読んでみよう。

activemodel/lib/active_model/validations/numericality.rb