JSONAPI-Resources / JSONAPI-Resources/jsonapi-resources

Scoping a `has_one` relationship

Offen
#627 6 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

After searching for a while, the answer here isn't obvious to me, so I thought I'd bring it up as an issue for reference.

I have 3 models:

class User < ActiveRecord::Base
  has_many :answers
end

class Question < ActiveRecord::Base
  has_many :answers
end

class Answer < ActiveRecord::Base
  belongs_to :user
  belongs_to :question
end

What I'd like to do is include the current_user_answer in a questions#show request, like so: /api/questions/123?include=current_user_answer. It seems like I should be able to write my QuestionResource as follows:

class QuestionResource < JSONAPI::Resource
  has_many :answers

  has_one :current_user_answer, class_name: 'Answer'

  # doesn't get called
  def self.record_for_current_user_answer(options={})
        current_user = options[:context][:current_user]
        AnswerResource.records(options).find_by(
          question: @model,
          user: current_user
        )
  end

  # doesn't get called either
  def current_user_answer(options={})
        current_user = options[:context][:current_user]
        AnswerResource.records(options).find_by(
          question: @model,
          user: current_user
        )
  end
end

Neither of these methods get called; instead, I get an exception "Association named 'current_user_answer' was not found on Question; perhaps you misspelled it?" Well, by definition here I'm trying to avoid writing a query method directly on the model, and anyways such a query method or association would need to get the context passed in from the enclosing Resource.

In short, there seems to be no documented way to scope an included associated to something in the context. Or am I missing something? What's the canonical way to get this related resource without an extra request?

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

Beginnen Sie mit der Deklaration der QuestionResource-Beziehung und der hier beschriebenen Anfrage /api/questions/123?include=current_user_answer; reproduzieren Sie die association-not-found exception und verfolgen Sie, wie eingeschlossene has_one-Beziehungen aufgelöst werden. Ermitteln Sie, ob eine kontextbezogene Suche unterstützt wird, und dokumentieren oder implementieren Sie eine kanonische Möglichkeit, das zugehörige Answer ohne eine zusätzliche Anfrage zurückzugeben.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
rails, ruby
Bereich
api, backend
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

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