Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 处理业务代码中的GraphQL枚举值_Ruby On Rails_Ruby_Enums_Graphql_Graphql Ruby - Fatal编程技术网

Ruby on rails 处理业务代码中的GraphQL枚举值

Ruby on rails 处理业务代码中的GraphQL枚举值,ruby-on-rails,ruby,enums,graphql,graphql-ruby,Ruby On Rails,Ruby,Enums,Graphql,Graphql Ruby,我有一个GraphQL枚举,如: class MediaFilterType < Types::BaseEnum value "TWITTER", value: :twitter value "FACEBOOK", value: :facebook value "YOUTUBE", value: :youtube end 所以我必须对每个字段进行条件净化,就像仪表板字段一样。除了复制品,没什么大不了的。但我认为这是一

我有一个GraphQL枚举,如:

class MediaFilterType < Types::BaseEnum
  value "TWITTER", value: :twitter
  value "FACEBOOK", value: :facebook
  value "YOUTUBE", value: :youtube
end
所以我必须对每个字段进行条件净化,就像仪表板字段一样。除了复制品,没什么大不了的。但我认为这是一项应该在查询内部承担的责任(有一个合作者可以在查询对象内部进行清理)。但我认为从业务对象内部的GQL枚举类型中提取值会更糟糕。实际上我甚至不知道我是否应该提取这些枚举值

像这样从GQL类型中提取值是一种好的做法吗

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

感谢您的帮助。

这里没有确定的“正确”答案。问题是,GraphQLRuby在许多其他情况下需要相当多的重复—想想您的模型和类型。我不会太害怕一点点的重复。然而

但我认为从业务对象内部的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
您的模型enum现在充当真理的单一来源

然而,随着时间的推移,您的API与您的模型有一点不同并不罕见,因此在这种情况下,至少复制一些东西并不是一种好方法。只是要记住这一点

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