Разрешение внешних ключей в Om Next
Я пытаюсь понять концепции нормализации, идентичности и запросов в Om Next. Каждый раз, когда я думаю, что у меня есть это, я сталкиваюсь с новой ситуацией, которая, кажется, сбивает меня с толку.
У меня есть пульт, который возвращает следующие данные:
{:users [
{:id 1,
:email "foo@example.com",
:role 1},
{:id 3,
:email "bar@floyhamilton.nl",
:role 1},
{:id 4,
:email "baz@example.com",
:role 1},
{:id 6,
:email "nom@example.com",
:role 1}}]
:roles [
{:id 1, :name "admin"}]}
Я структурировал свои компоненты так:
(defui Root
static om/IQuery
(query [this]
`[{:users ~(om/get-query User)}
{:roles ~(om/get-query Role)}]))
(defui Role
static om/Ident
(ident [this {:keys [id]}]
[:role/by-id id])
static om/IQuery
(query [this]
[:id :name]))
(defui User
static om/Ident
(ident [this {:keys [id]}]
[:user/by-id id])
static om/IQuery
(query [this]
[:id :email :role]))
Это приводит к тому, что согласующий нормализует мои данные следующим образом:
{:users
[[:user/by-id 1] [:user/by-id 3] [:user/by-id 4] [:user/by-id 6]],
:roles [[:role/by-id 1]],
:user/by-id
{1
{:id 1,
:email "foo@example.com",
:role 1},
3
{:id 3,
:email "bar@floyhamilton.nl",
:role 1},
4
{:id 4,
:email "baz@example.com",
:role 1},
6
{:id 6,
:email "nom@example.com",
:role 1}},
:role/by-id {1 {:id 1, :name "admin"}}}
Теперь по моему вопросу. Я хотел бы получить доступ к имени роли пользователя внутри компонента. Я мог бы просто сделать что-то вроде (get-in @app-state [:role/by-id role :name])
внутри функции рендеринга компонента User, но это не похоже на идиоматическую вещь, которую нужно делать.
Документ Om Next "Мышление со ссылками", кажется, упоминает мое решение: idents. Я пытался использовать это в запросе пользователя (например, [:id :email [:role/by-id 1]]
) и это работает! Однако я не могу вставить действительный идентификатор роли в идентификатор! Я пробовал очень сложные вещи с параметрами запроса, вставляя их в отступ таким образом, но все это кажется ужасно надуманным.
Это кажется невероятно распространенной ситуацией, для которой должно существовать достойное решение, но я не могу его найти!
* РЕДАКТИРОВАТЬ Добавлен компонент Root
1 ответ
Ваш синтаксис запроса для User
должно быть что-то вроде этого:
[:id :email {:user-role (om/get-query Role)}]
Тогда состояние таблицы для пользователя может быть:
{:id 6,
:email "nom@example.com",
:user-role [:role/by-id 1]}
Это помогло бы, если бы вы показали свой defui
в вопросе, особенно для Root
, Одна вещь с Om.Next состоит в том, что все объединения должны быть сделаны на Root
компонент для того, чтобы получить нормальное состояние приложения.