问题描述
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类型中提取值是否是一种好习惯?
感谢任何帮助。
解决方法
这里没有明确的“正确”答案。问题是,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与模型之间的差异会随着时间的推移而有所改变,因此在这种情况下,实际上并没有很好的方法来复制至少某些内容。只是要记住这一点。