【问题标题】:Dealing with GraphQL Enum values in business code处理业务代码中的 GraphQL Enum 值
【发布时间】:2021-02-10 22:49:27
【问题描述】:

我有一个 GraphQL 枚举,例如:

class MediaFilterType < Types::BaseEnum
  value "TWITTER", value: :twitter
  value "FACEBOOK", value: :facebook
  value "YOUTUBE", value: :youtube
end

还有一个接收此类型数组或 nil 的字段。实际上,当我们收到 nil 时,我们应该传递我们将使用枚举中的所有可用值:

def dashboard(media_types: nil)
  if media_type.nil?
    # Here is the problem below
    media_types = MediaFilterType.values.values.map(&:value)
  end
  ...
  DashboardQuery.new(media_types).call
end

所以我必须对每个字段进行这种有条件的清理,就像仪表板字段一样。没什么大不了的,除了重复。但我认为这是一个应该在 Query 内部的责任(有一个协作者可以在 Query 对象内部进行清理)。但我认为从业务对象内的 GQL 枚举类型中提取值会更糟。实际上我什至不知道我是否应该提取这些枚举值。

这样从 GQL 类型中提取值是一种好习惯吗?

  • 如果没问题,还有另一种方法可以在业务对象(如查询对象或消毒剂)中使用枚举值,而不让它们依赖于 GQL 枚举类型? 我应该在业务层中创建一个具有相同值的 Enum 吗?

感谢任何帮助。

【问题讨论】:

    标签: ruby-on-rails ruby enums graphql graphql-ruby


    【解决方案1】:

    这里没有明确的“正确”答案。问题是,graphql-ruby 在许多其他情况下需要相当多的重复——想想你的模型和类型。我不会太害怕一点点重复。不过……

    但我认为从业务对象内的 GQL 枚举类型中提取值会更糟糕

    视情况而定。如果这些值在 API 中使用,而实际上在其他任何地方都没有,那么您的实现就已经是最好的了。

    我应该在我的业务层中创建一个具有相同值的 Enum 吗?

    这是一个选项。如果你放弃 GraphQL 枚举类型的文档,你可以相当优雅地摆脱任何重复。假设您将媒体过滤器添加为某个模型上的枚举:

    class Dashboard
      enum media_types: [:twitter :facebook :youtube]
    end
    

    你可以这样做:

    class MediaFilterType < Types::BaseEnum
      Dashboard.media_types.each { |media_type| value(media_type.upcase, value: media_type.to_sym)}
    end
    

    对于你的领域:

    types = media_types || Dashboard.media_types
    DashboardQuery.new(media_types).call
    
    

    您的模型枚举现在用作单一的事实来源。

    但是,随着时间的推移,您的 API 与您的模型略有不同的情况并不少见,因此在这种情况下,至少复制一些东西确实没有什么好的方法。请记住这一点。

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 2020-04-30
      • 2017-08-26
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2020-12-12
      相关资源
      最近更新 更多