在业务代码中处理GraphQL枚举值

问题描述

我有一个类似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枚举类型? 我应该在我的业务层中创建一个具有相同值的枚举吗?

感谢任何帮助。

解决方法

这里没有明确的“正确”答案。问题是,graphql-ruby在许多其他情况下需要大量重复-考虑您的模型和类型。我不会太害怕一点重复。但是...

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

视情况而定。如果这些值仅在API中使用 ,而实际上在其他任何地方都没有实现那么好。

我应该在业务层中创建具有相同值的枚举吗?

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

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

针对您的领域:

Optional<T>.empty()

您的模型枚举现在充当真理的单一来源。

但是,您的API与模型之间的差异会随着时间的推移而有所改变,因此在这种情况下,实际上并没有很好的方法来复制至少某些内容。只是要记住这一点。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...