JSONAPI-Resources / JSONAPI-Resources/jsonapi-resources
Scoping a `has_one` relationship
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
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Ö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