处理业务代码中的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 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与模型有点不同并不罕见,因此在这种情况下,确实没有一种很好的方法来复制至少一些东西。只是要记住这一点。

最新更新