序列化器中重写 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 类似,但它们接受一个输入值并返回一个值。因此,在你的情况下,你可以做一个核心 PR,在相关的 include_ 方法中添加一个 DiscoursePluginRegistry.apply_modifier 调用,然后在你的插件中使用 register_modifier 来覆盖该值。

是的,我们最终可能会完全阻止它。而且你真的不想使用一个在日志中打印弃用噪音的方法。

如果你确实必须在没有核心协作的情况下覆盖一个方法,那么 modify_class 似乎是更好的选择。我们有一个专门的 add_to_serializer 的主要原因是它会自动定义一个 include_* 方法,这样它只在插件启用时才适用。

这意味着你链接的代码片段目前定义了两个方法: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 天自动关闭。不再允许回复。