JSONAPI-Resources / JSONAPI-Resources/jsonapi-resources

Could _add_relationship generated methods use resource_for_model instead of resource_for?

Ouverte
#757 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Type: Bug
Langage dominant
Ruby
Étoiles
2.3k
Forks
546
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

In an application I'm working on, we had an issue where we had a model with a polymorphic belongs to association, that used different resource subclasses based on the type of the association.

For the basic index, show, etc. actions this worked fine (you can override resource_type_for or use model hints), but when we tried to access one of these models using a get_related_resource route, we found that it used the superclass resource.

This seems to be because of this method in resource.rb:

define_method relationship_name do |options = {}|
  relationship = self.class._relationships[relationship_name]

  if relationship.polymorphic?
    associated_model = public_send(associated_records_method_name)
    resource_klass = self.class.resource_for_model(associated_model) if associated_model
    return resource_klass.new(associated_model, @context) if resource_klass
  else
    resource_klass = relationship.resource_klass
    if resource_klass
      associated_model = public_send(associated_records_method_name)
      return associated_model ? resource_klass.new(associated_model, @context) : nil
    end
  end
end unless method_defined?(relationship_name)

Using relationship.resource_klass looks up the resource class using the class of the model, which doesn't allow for the resource class to be changed based on attributes of the model. At this point, the model instance is known, so it should be possible to adapt it to look up the resource class based on the model instance instead of the model class.

Currently, we're getting around this by overriding .new on the superclass relationship like this, but it's pretty hacky:

def self.new(model, *args)
  return super if self < V1::QuestionResource || model.content_type.nil?
  resource_for_model(model).new(model, *args)
end

Is this something there'd be interest in changing?

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans lib/jsonapi/resource.rb, au niveau de la méthode de relation générée montrée dans l’issue, en comparant les branches polymorphe et non polymorphe. Suivez comment get_related_resource atteint cette méthode et vérifiez que l’instance du modèle peut sélectionner la sous-classe de ressource prévue sans perturber le comportement existant des relations.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
ruby
Domaine
api, backend
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.