JSONAPI-Resources / JSONAPI-Resources/jsonapi-resources

Could _add_relationship generated methods use resource_for_model instead of resource_for?

Abierto
#757 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Type: Bug
Lenguaje dominante
Ruby
Estrellas
2.3k
Forks
546
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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?

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en lib/jsonapi/resource.rb, en el método de relación generado que se muestra en el issue, comparando las ramas polimórfica y no polimórfica. Sigue cómo get_related_resource llega a este método y verifica que la instancia del modelo pueda seleccionar la subclase de recurso prevista sin romper el comportamiento existente de las relaciones.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
ruby
Área
api, backend
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.