👋 Next.js Conf 2024: Come build, party, run, and connect with us! See all events

Is it possible to have a `type: array`, of more than one entry for `type: reference` ? I kept getting an error that pointed to <https://www.sanity.io/help/schema-array-of-invalid>...

12 replies
Last updated: Dec 31, 2020
Is it possible to have a
type: array
, of more than one entry for
type: reference
? I kept getting an error that pointed to https://www.sanity.io/help/schema-array-of-invalid when I tried to make multiple
{type: 'reference', to: [a single type]}
. I tried uniquely `name`ing them on both the
to
values, and the reference type itself, but it's hung up on the fact I have dozens of
reference
types in the
type: 'array'
.
Currently reverted back to just a single
type: 'reference'
with a lot of
to
values, but it's problematic because of the many types I have, many of them have hundreds of results, making it very difficult for me to say I want "this document" from "this type"
The generated groq from that on dash is quite huge too since it has to match on a ton of fields on each type
😐
Dec 29, 2020, 9:47 PM
Do you have it set up like this?

fields: [
  ...,
  {
    name: "involved",
    title: "People Involved",
    type: 'array',
    of: [
      {
        type: "reference",
        to: [{ type: "managers" }, { type: "staff" }],
      },
    ],
  },
...
}

Dec 29, 2020, 10:03 PM
thats what i currently have it set up as, but I would like to have multiple
type: 'reference'
inside it so I can have more targeted search by types
Dec 29, 2020, 10:03 PM
Or some means of being able to select what type that was given to it in the reference link dialog. Right now the choice is search all the `to`s, which is like dumping the entire dataset every search
Dec 29, 2020, 10:05 PM
You can’t have multiple ones like you describe unfortunately, but would it help with a filter? https://www.sanity.io/docs/reference-type#filter-ebd7a95f9dc6
Dec 30, 2020, 8:36 AM
Right now the choice is search all the `to`s, which is like dumping the entire dataset every search
This shouldn't be a concern, it's basically the same as any query to the dataset, but I get why the user experience might not be the best if you don't what to search for.
The solution here is to add
name
 to the array fields so that the studio knows how to differ between them.
{
      name: 'multipleReferences',
      type: 'array',
      of: [
        {
          name: 'referenceA',
          type: 'reference',
          to: [{type: 'a'}],
          title: 'Make reference to A docs'
        },
        {
          name: 'referenceB',
          type: 'reference',
          to: [{type: 'b'}],
          title: 'Make reference to B docs'
        }
      ]
    },

Dec 30, 2020, 9:39 AM
This will change the array items` 
_type
 from
reference
 to
referenceA
and
referenceB
Dec 30, 2020, 9:40 AM
Wish it didn't change the _type (current auto-dereferencing code I wrote doesn't understand that) but I guess I can match on _type
^reference(_\w*)?
and pray everyone follows convention.
Dec 31, 2020, 3:42 PM
You can look for the
_ref
key?
Dec 31, 2020, 3:43 PM
That’s the best guarantee. I see your point though!
Dec 31, 2020, 3:43 PM
Probably, but is that _ref key protected like _type is (as in, I can't make a field
name: '__ref')
? (you're drunk slack, get some coffee)
Dec 31, 2020, 3:43 PM
Good to know though. A coworker recently fell into that
name
trap and neither of us could figure out what was going on (outside of "name seems to be dangerous, dont use it)". Now I can explain it lol
Dec 31, 2020, 3:45 PM
I don’t think it’s protected like that, but I have never observe anyone use it outside of the reference context. We should probably throw a warning if you do add field names that corresponds with those we use for specific things
Dec 31, 2020, 5:44 PM

Sanity– build remarkable experiences at scale

Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.

Was this answer helpful?