2020-05-14
User.all.class
するとUser::ActiveRecord_Relation
をいざ参照しに行こうとするとNameErrorになってしまうのはなんだろう、とruby-jpに質問しに行ったら、private constantとのこと。なるほど。
ちなみにUser.all.class.name
するとActiveRecord::Relation
が出てくる。これは https://github.com/rails/rails/blob/ac65e560db598c7a8b1b6aaea1e5656ff3b27f08/activerecord/lib/active_record/relation/delegation.rb#L98-L100 で定義されていた。
private constantの場合でも"uninitialized constant"としか表示されなかったから気が付かなかったのだけど、これはクラスのオートロードが絡んでいそうな予感がある。 たとえば次のコードをふつーにrubyで実行したときとrails runnerで実行したときで違う結果が出た。
class A B = 1 private_constant :B end A::B rescue p $!
$ ruby test.rb #<NameError: private constant A::B referenced> $ rails runner test.rb #<NameError: uninitialized constant A::B>
ちなみにRailsのバージョンは5.2。6だとどうなるかは未検証
神様ごはん-小料理 高天原にようこそ-、よかった。じんわり良い。2巻でぐっと良くなったのに続きがなくて悲しいね…
同じ作者の座敷娘と料理人もそうだったけど、ふんわりあったかい本編と、面白い巻末のギャグ4コマのどっちもが面白くて本当に良い。
神様ごはんの、この複数のストーリーがふんわりと絡み合う感じを読んでいると、久々にクロノス・ジョウンターの伝説を思い出して読み返したくなってきた。