diary

I like Hatena Star with a text selection.

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コマのどっちもが面白くて本当に良い。

神様ごはんの、この複数のストーリーがふんわりと絡み合う感じを読んでいると、久々にクロノス・ジョウンターの伝説を思い出して読み返したくなってきた。