Разрешение внешних ключей в 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 компонент для того, чтобы получить нормальное состояние приложения.

Другие вопросы по тегам