シリアライザーで include_* メソッドをオーバーライドする

こんにちは、@davidさん

この非推奨に関する考え方について、簡単な質問があります。

非推奨通知:add_to_serializer は、include_*? メソッドを直接オーバーライドするために使用すべきではありません。

コンテキスト:DEV: Improve add_to_serializer include_* options (#21220) · discourse/discourse@26b7f8a · GitHub

add_to_serializer メソッドの標準的な使用法で、include_condition 引数に移行したいという意図は理解しています。つまり、独自のメソッドをシリアライザーに追加する場合です。

しかし、プラグインがシリアライザーに include_* メソッドを追加したいが、それがそのケースに当てはまらない場合があります。つまり、独自のカスタム属性が含まれるかどうかを判断するのではなく、コアシリアライザーの include_* メソッドをオーバーライドする場合です。例:

コアメソッド:discourse/app/serializers/site_serializer.rb at main · discourse/discourse · GitHub

サイトシリアライザーメソッドのオーバーライドを不要にするように、あるいは他の方法でオーバーライドを実現するように、この特定のユースケースを再考できることは理解していますが、この方法で add_to_serializer メソッドを使用することに内在的な欠点があるかどうか、そしてこの非推奨がこの方法でのメソッドの使用を削除することにつながるかどうかを知りたいです。

「いいね!」 4

はい、それが私の推奨事項です。

最近、‘プラグインモディファイア’ という新しいシステムを導入しました。これは DiscourseEvent に似た非常に安価な拡張ポイントですが、入力値を受け取り、値を返します。したがって、この場合、関連する include_ メソッドに DiscoursePluginRegistry.apply_modifier 呼び出しを追加するためにコア PR を作成し、その後、プラグインで register_modifier を使用して値をオーバーライドできます。

最終的には完全にブロックする可能性が高いです。さらに、ログに非推奨のノイズを出力するメソッドを使用することは避けたいはずです。

コアの協力を得ずにメソッドをオーバーライドする必要がある場合は、modify_class の方が良い選択肢となるでしょう。専用の add_to_serializer がある主な理由は、include_* メソッドを自動定義するため、プラグインが有効な場合にのみ適用されるからです。

これにより、リンクされたコードスニペットは現在2つのメソッドを定義しています。include_wizard_required?include_include_wizard_required? :sweat_smile:

「いいね!」 11

Readmeには「スタック(先入れ先出し)として動作する」と書かれていますが、それはキューです。スタックは先入れ後出しです。(携帯電話でテキストをコピーする方法がわかりません)。

「いいね!」 4

よく気が付きましたね。はい、スタックはLIFO(後入れ先出し)で、キューはFIFO(先入れ先出し)です。

これらのモディファイアの主な特徴:

  • スタックで動作する(最初に登録されたものが最初に呼び出される)
  • プラグインが無効になると自動的に無効になる
  • すべてのブロック呼び出しの累積結果を呼び出し元に渡す
「いいね!」 1

それは「ミドルウェアスタック」のようなものです。メソッドが順番に実行され、各メソッドはその結果を次のメソッドの入力に渡します。

LIFO/FIFOの用語をここに適用しようとしても機能しないと思います。スタックに追加/削除されるものはありません。「アウト」はありません。

「いいね!」 4

ああ。スタックデータ構造ではないのですね。

1987年にコンピュータサイエンスの学位を取得しましたが、今の人たちが何を学んでいるのか分かりません。:joy:

「いいね!」 2

これが私の問題のようなものです。私はコンピューターからほとんど離れていた約10年間の空白期間があり(コンピューターを25年以上使っていた後)、それは巨大な知識ベースのセクションが欠けているように感じます。

「いいね!」 3

このトピックは、最後の返信から30日後に自動的にクローズされました。新しい返信は許可されていません。