[Rails] Polymorphique express avec graphql-ruby

introduction

Récemment, j'ai implémenté une API avec graphql-ruby. Rails a une fonction pratique appelée polymorphe pour associer des modèles. J'expliquerai comment exprimer cela en graphql en utilisant UnionType.

Chose que tu veux faire

Prenons le cas où les tables User et PetShop sont propriétaires et polymorphes dans la table Dog. Lorsque vous obtenez un chien avec graphql, assurez-vous que la colonne de son propriétaire (user ou pet_shop) est également prise.

Sinon polymorphe

Tout d'abord, passons en revue le cas des associations normales (appartient_à, has_many, etc.). Supposons que l'utilisateur et le chien soient un-à-plusieurs, comme indiqué ci-dessous.

user.rb


Class User < ApplicationRecord
  has_many: dogs
end

dog.rb


Class Dog < ApplicationRecord
  belongs_to: user
end

ObjectType Pour exprimer l'association définie dans le modèle avec graphql-ruby, écrivez ObjectType comme suit.

user_type.rb


Class UserType < Types::BaseObject
  field :id, ID, null: false
end

dog_type.rb


Class DogType < Type::BaseObject
  field :name, String, null: false
  field :user, ObjectTypes::UserType, null: false #Association avec l'utilisateur
end

Si vous définissez ObjectType comme ci-dessus, il obtiendra également l'objet utilisateur associé lors du retour de l'objet chien.

Pour polymorphe

Ensuite, considérons le cas de l'association polymorphe. Outre l'utilisateur, petShop possède également un chien.

Association de modèles

Pour les polymorphes, l'association du modèle Rials est la suivante:

user.rb


Class User < ApplicationRecord
  has_many :dogs, as: :ownerable
end

pet_shop.rb


Class PetShop < ApplicationRecord
  has_many :dogs, as: :ownerable
end

dog.rb


Class Dog < ApplicationRecord
  belongs_to :ownerable, polymorphic: true
end

ObjectType Ensuite, définissez le type d'objet. L'objet petShop a été ajouté et le champ dogType a été changé en ownerable pour indiquer une association polymorphe au lieu de user.

user_type.rb


Class UserType < Types::BaseObject
  field :id, ID, null: false
end

pet_shop_type.rb


Class PetShopType < Types::BaseObject
  field :id, ID, null: false
end

dog_type.rb


Class DogType < Type::BaseObject
  field :name, String, null: false
  field :ownerable, UnionTypes::OwnerableType, null: false #Association avec propriétaire
end

Notez que le type propriétaire est UnioTypes au lieu d'ObjectTypes. UnionType sera défini à partir de maintenant. UnioneType UnioType est au cœur de cet article. Le propriétaire défini dans dogType est défini comme UnionType, et il fait la distinction entre userType et petShopType.

ownerable_type.rb


module UnionTypes
  class OwnerableType < Types::BaseUnion
    # possible_Déclarer les types qui peuvent être associés aux types
    possible_types ObjectTypes::UserType, ObjectTypes::PetShopType

   #Décrire le traitement des succursales
    def self.resolve_type(object, _context)
      if object.is_a?(User)
        ObjectTypes::PostType
      elsif object.is_a?(PetShop)
        ObjectTypes::ReplyType
      end
    end
  end
end

En écrivant comme ci-dessus, il déterminera le type à renvoyer par le résolveur et sélectionnera Utilisateur ou PetShop. (Cela ne ressemble pas à du rubis, mais ...) Query Lors de l'utilisation d'UnionType, la requête est également écrite d'une manière légèrement spéciale.

query{
  dog(id: [dog_id]){
    id
    ownerable {
      __typename #Spécifiez le type
      ... on User {
        id
      }
      __typename
      ... on PetShop {
        id
      }
    }
  }
}

Vous pouvez sélectionner le propriétaire souhaité en spécifiant le nom du type comme décrit ci-dessus.

Recommended Posts

[Rails] Polymorphique express avec graphql-ruby
[Rails 6] Erreur d'exécution avec $ rails s
Manipuler le dispositif avec des rails
[Rails] Didacticiel Apprendre avec les rails
[Rails] Test avec RSpec
[Rails] Développement avec MySQL
Prend en charge la multilinguisme avec Rails!
Obstrué par l'installation Express npm
[Rails] Télécharger des vidéos avec Rails (ActiveStorage)
[Vue Rails] "Hello Vue!" Affiché avec Vue + Rails
Japaneseize en utilisant i18n avec Rails
Préparation au développement avec Rails
Exécuter des rails à chaque fois dans le docker
[Docker] Construction de l'environnement Rails 5.2 avec docker
Utilisez plusieurs bases de données avec Rails 6.0
[Rails] Spécifiez le format avec link_to
[Docker] À utiliser à tout moment avec Docker + Rails
Créer un portfolio avec rails + postgres sql
[Rails] Transmission push avec LINE Bot
[Rails] Rendre la pagination compatible avec Ajax
Exécutez Nginx + Express avec Fargate 4 Core
Créer une fonction de pagination avec Rails Kaminari
[Grover] Générer un PDF avec des rails [version 2020]
[Rails] Création initiale des données avec seed
Suivre les erreurs de l'application Rails avec Sentry
[Construction de l'environnement avec Docker] Rails 6 et MySQL 8
Connectez-vous au serveur Rails avec iPhone
Créer ma page avec Rails
Présentation de React to Rails avec react-rails
[Rails] Entrée de données initiale avec seed_fu!
Recherche intemporelle avec Rails + JavaScript (jQuery)
[rails] Faisons un test unitaire avec Rspec!