Nested Queries
We can nest all read operations at any level of the graph. Let’s say we wanted to
fetch all Post
s and their Comment
s…but only return comments that
are active
, sorted by created_at
descending. We can create a
Comment
scope as normal, then #merge()
it into our Post
scope:
let commentScope = Comment
. where ({ active : true })
. order ({ created_at : "desc" })
Post
. includes ( "comments" )
. merge ({ comments : commentScope })
. all ()
var commentScope = Comment
. where ({ active : true })
. order ({ created_at : "desc" })
Post
. includes ( "comments" )
. merge ({ comments : commentScope })
. all ()
/posts?include=comments&filter[comments][active]=true&sort=-comments.active
Because this can get verbose, it’s often desirable to store it on
the class:
class Comment extends ApplicationRecord {
// ... code ...
static recent () {
return this
. where ({ active : true })
. order ({ created_at : "desc" })
}
}
Post . merge ({ comments : Comment . recent () }). all ()
const Comment = ApplicationRecord . extend ({
// ... code ...
static : {
recent : function () {
return this
. where ({ active : true })
. order ({ created_at : "desc" })
}
}
})
Post
. includes ( "comments" )
. merge ({ comments : Comment . recent () })
. all ()
Any number of scopes can be merged in. Just remember to #include()
and #merge()
relationship names as the server understands them :
class Dog extends ApplicationRecord {
@ BelongsTo () person : Person
}
// We've modeled this as Dog > person in javascript
// And Person is jsonapiType "people"
// But the server defined the relationship as "owner"
Dog . includes ( "owner" ). merge ({ owner : Person . limitedFields () })
const Dog = ApplicationRecord . extend ({
// ... code ...
methods : {
person : belongsTo ()
}
})
// We've modeled this as Dog > person in javascript
// And Person is jsonapiType "people"
// But the server defined the relationship as "owner"
Dog . includes ( "owner" ). merge ({ owner : Person . limitedFields () })