週刊Railsウォッチ(20181015)Rails初心者と一発でバレる書き方、次のVue.js構想、RubyのOpenStruct、Twilioほか

こんにちは、hachi8833です。Pixel 3がちょい気になっています。 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話です👄 つっつきボイス:「お、Pixel 3か、値段の割にストレージが少ないんですよね📱: 今の自分のiPhoneも、いつか見るつもりのNetFlix動画やら音楽やらであっというまにストレージ埋まっちゃうし」「私はWikipedia(日と英)がまるっと入ればいいかな…」「Pixelを見てると、ちゃんとしたスマホを作れば結局このぐらいの値段になるよなって思いますね😎」 ⚓Rails: 先週の改修(Rails公式ニュースより) ⚓名前付きスコープに委譲するメソッドを定義のタイミングで生成 PR: Generate delegation methods to named scope in the definition time by kamipo · Pull Request #34122 · rails/rails 名前付きスコープへ委譲するメソッドは、リレーションでmethod_missingが呼び出されるときに定義される。 名前付きスコープ内のレシーバは#29301以降、一貫性のためdefault_scopeなどと同様にリレーションに変更されている。 大半の名前付きスコープはmethod_missingでリレーションから委譲される。というのも、Relationのインスタンスメソッドと競合しないよう#31179でスコープの定義を許さなくなったため。しかし、名前付きスコープと同じ名前のメソッドがスーパークラス(Kernel.openとか)のいずれかのメソッドで定義されていると、リレーションのmethod_missingが呼び出されていなかった。 問題修正のため、名前付きスコープに委譲するメソッドは定義時に生成されるようにする。 同PRより大意 # activerecord/lib/active_record/relation/delegation.rb#L34 + protected + def include_relation_methods(delegate) + superclass.include_relation_methods(delegate) unless base_class? + delegate.include generated_relation_methods + end + private + def generated_relation_methods + @generated_relation_methods ||= Module.new.tap do |mod| + mod_name = “GeneratedRelationMethods” + const_set mod_name, mod + private_constant mod_name + end + end + def generate_relation_method(method) + if /\A[a-zA-Z_]\w*[!?]?\z/.match?(method) + generated_relation_methods.module_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(*args, &block) + scoping { klass.#{method}(*args, &block) } + end + RUBY + else + generated_relation_methods.send(:define_method, method) do |*args, &block| + scoping { klass.public_send(method, *args, &block) } + end + end + end + end + end つっつきボイス:「generated_relation_methodsで@generated_relation_methods ||= Module.new.tapでメモ化してから定数をprivateにして渡している」「generated_relation_methods.send(:define_method, method)でdefine_methodを使って定義してるんですね」「難しい…」 参考: instance method Module#define_method (Ruby 2.5.0) 参考: instance method Module#private_constant (Ruby 2.5.0) ⚓関連付けの再読み込み時にQueryCacheをクリアすることで振る舞いを一貫させた PR: Fix inconsistent behavior by clearing QueryCache when reloading associations by christophemaximin · Pull Request #34094 · rails/rails # 「Post –has_many–> comments」「Post –has_one/belongs_to–> author」が前提 # この場合QueryCacheがクリアされ、レコードが読み込まれる post.reload # この場合QueryCacheの外でクエリが実行されることでレコードが読み込まれるが # QueryCacheはクリアされない post.reload_author # この場合レコードは読み込まれず、QueryCacheもクリアされない … Continue reading 週刊Railsウォッチ(20181015)Rails初心者と一発でバレる書き方、次のVue.js構想、RubyのOpenStruct、Twilioほか