处理业务代码中的 GraphQL Enum 值
Dealing with GraphQL Enum values in business code
我有一个 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 枚举类型吗?
我应该在我的业务层中创建一个具有相同值的枚举吗?
感谢任何帮助。
这里没有明确的 'right' 答案。问题是,graphql-ruby 在许多其他情况下需要相当多的重复——想想你的模型和类型。我不会太害怕一点点重复。然而...
But I think it would be worse to extract the values from the GQL enum type inside a business object
视情况而定。如果这些值 仅 在 API 中使用,而实际上在其他任何地方都没有使用,那么您的实施已经达到了最佳状态。
Should I create an Enum with the same values in my business layer?
这是一个选项。如果您放弃 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 与您的模型有一点偏差的情况并不少见,因此在这种情况下,确实没有很好的方法来复制至少一些东西。谨记这一点。
我有一个 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 枚举类型吗? 我应该在我的业务层中创建一个具有相同值的枚举吗?
感谢任何帮助。
这里没有明确的 'right' 答案。问题是,graphql-ruby 在许多其他情况下需要相当多的重复——想想你的模型和类型。我不会太害怕一点点重复。然而...
But I think it would be worse to extract the values from the GQL enum type inside a business object
视情况而定。如果这些值 仅 在 API 中使用,而实际上在其他任何地方都没有使用,那么您的实施已经达到了最佳状态。
Should I create an Enum with the same values in my business layer?
这是一个选项。如果您放弃 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 与您的模型有一点偏差的情况并不少见,因此在这种情况下,确实没有很好的方法来复制至少一些东西。谨记这一点。