まいのこマート:アイテムの並びを行順で統一する
Closedfirst published: 2019/01/22last updated: 2019/01/22
妻から「カテゴリー押すとアイテムの並びが変になる」と言われた。
確かに、「すべて」の並びでは「ホーム・キッチン」の商品がコーヒーメーカー → 加湿器 → 空気清浄機と並んでいるのに、「ホーム・キッチン」カテゴリーでは並びが変わってしまう。違和感のある絞り込み。
アイテムにはブログ記事のような日時がないため、Airtableの行順で表示している。妻が「これは前に置いたほうがいいな」と判断したものを任意の順で品出しできるイメージ。
アイテムテーブルを参照するとこの並びで表示されるが、カテゴリーテーブルの持っているアイテムデータは「カテゴリーに登録した順」になっており、並びが違ってしまう。
じゃ、行番号を並び順に自動で降り、その数値を取得して並びかえすれば揃うだろうと考えたが、そういう関数は今の所ない様子。
もっと単純に、同じテーブルをもとに出力すればいいだろうと考えた。indexはアイテムテーブル、categoryはカテゴリーテーブルのアイテムを参照していたので、categoryもアイテムテーブルを参照させる。
Before
カテゴリーテーブルの持っていたアイテムを参照していた。
export const query = graphql`
query GetCategory($slug: String!) {
airtable(table: { eq: "categories" }, data: { slug: { eq: $slug } }) {
data {
name
slug
icon_style
icon_name
items {
data {
title
published
slug
image {
url
thumbnails {
large {
url
}
}
}
}
}
}
}
}
`
After
アイテムテーブルを参照してカテゴリーのスラッグとマッチしたものだけを取得する。
export const query = graphql`
query GetCategory($slug: String!) {
categories: airtable(data: { slug: { eq: $slug } }) {
data {
name
slug
icon_style
icon_name
items {
data {
published
}
}
}
}
items: allAirtable(
filter: {
table: { eq: "items" }
data: { category: { elemMatch: { data: { slug: { eq: $slug } } } } }
}
) {
edges {
node {
data {
title
published
slug
image {
url
thumbnails {
large {
url
}
}
}
}
}
}
}
}
`
これで、indexとカテゴリーの並びが揃い、カテゴリーに遷移した時に絞り込まれたように見せることができた。