JSONAPI-Resources / JSONAPI-Resources/jsonapi-resources

Could _add_relationship generated methods use resource_for_model instead of resource_for?

Offen
#757 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Type: Bug
Vorherrschende Sprache
Ruby
Sterne
2.3k
Forks
546
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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?

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne in lib/jsonapi/resource.rb bei der im Issue gezeigten generierten Beziehungsmethode und vergleiche die polymorphen und nicht polymorphen Zweige. Verfolge, wie get_related_resource diese Methode erreicht, und überprüfe, dass die Modellinstanz die vorgesehene Ressourcenunterklasse auswählen kann, ohne das bestehende Beziehungsverhalten zu beeinträchtigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
ruby
Bereich
api, backend
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.