2016-02-22 7 views
3

Я пытаюсь нормализовать свою голову и думаю, что я продвигаюсь вперед, но я снова споткнулся и не уверен, что я просто неправильно думаю о проблеме. Как нормализовать сообщения текущего пользователя?Нормализация и идентификаторы в Ом/Следующая

(def init-data 
    {:session {:user/id 1 
      :messages [{:message/id 1}]} 
    :messages [{:message/id 1 :text "Message 1"} 
       {:message/id 2 :text "Message 1"}] 
    :users [{:user/id 1 :email "[email protected]"} 
      {:user/id 2 :email "[email protected]"}]}) 

(defui Message 
    static om/Ident 
    (ident [this {:keys [message/id]}] 
    [:message/by-id id]) 
    static om/IQuery 
    (query [this] 
    [:id])) 

(defui User 
    static om/Ident 
    (ident [this {:keys [user/id]}] 
     [:user/by-id id]) 
    static om/IQuery 
    (query [this] 
     `[:id {:properties ~(om/get-query Property)}])) 

(defui Session 
    static om/Ident 
    (ident [this {:keys [user/id]}] 
     [:user/by-id id]) 
    static om/IQuery 
    (query [this] 
     [:id])) 

(defui RootView 
    static om/IQuery 
    (query [this] 
    (let [message-query (om/get-query Message) 
      user-query (om/get-query User) 
      session-query (om/get-query Session)] 
    `[{:messages ~message-query} 
     {:users ~user-query} 
     {:session ~session-query}]))) 

=> (def norm-data (om/tree->db RootView init-data true)) 
=> (pp/pprint norm-data) 

{:session [:user/by-id 1], 
:messages [[:message/by-id 1] [:message/by-id 2]], 
:users [[:user/by-id 1] [:user/by-id 2]], 
:message/by-id 
{1 {:message/id 1, :text "Message 1"}, 
    2 {:message/id 2, :text "Message 1"}}, 
:user/by-id 
{1 {:user/id 1, :email "[email protected]", :messages [{:message/id 1}]}, 
    2 {:user/id 2, :email "[email protected]"}}, 
:om.next/tables #{:message/by-id :user/by-id}} 
+1

Я написал функцию под названием 'check', которая проверяет, был ли установлен формат по умолчанию-db. Я мог бы запустить его с вашим примером, но мне нужны «init-data». Можете ли вы поместить 'init-data' в суть или что-то еще? Я могу посмотреть на это завтра (поздно здесь). –

+0

Извините, Крис - забыли эту часть! Сейчас в этом вопросе (здесь и во всей его славе, как в сущности: https://gist.github.com/addywaddy/2b2ecf4ca389afb0d202). –

+0

Я вижу из состояния, что у пользователя есть электронное письмо и сообщение имеет текст. Я ожидаю, что компоненты будут отражать это, т.е. пользовательский компонент, чтобы иметь: электронную почту в запросе. Вместо этого я вижу ссылку на компонент Property, которого нет в вашем вопросе (как компонент или состояние). –

ответ

3

Я изменил свои первоначальные данные немного и удалось получить tree->db заставить нас разумный ищет по умолчанию-DB-формате, где идент вездесущи:

{:app/session [:session/by-id 1], 
:app/messages [[:message/by-id 100] [:message/by-id 101]], 
:app/users [[:user/by-id 200] [:user/by-id 201]], 
:message/by-id 
      {100 {:id 100, :text "Message 1"}, 101 {:id 101, :text "Message 2"}}, 
:user/by-id 
      {200 {:id 200, :email "[email protected]"}, 
      201 {:id 201, :email "[email protected]"}}, 
:session/by-id {1 {:id 1, :app/messages [[:message/by-id 100]]}}} 

следующие компоненты:

(defui Message 
    static om/Ident 
    (ident [this {:keys [id]}] 
    [:message/by-id id]) 
    static om/IQuery 
    (query [this] 
    [:id :text])) 

(defui User 
    static om/Ident 
    (ident [this {:keys [id]}] 
    [:user/by-id id]) 
    static om/IQuery 
    (query [this] 
    [:id :email])) 

(defui Session 
    static om/Ident 
    (ident [this {:keys [id]}] 
    [:session/by-id id]) 
    static om/IQuery 
    (query [this] 
    [:id {:app/messages (om/get-query Message)}])) 

(defui RootView 
    static om/IQuery 
    (query [this] 
    [{:app/messages (om/get-query Message)} 
    {:app/users (om/get-query User)} 
    {:app/session (om/get-query Session)}])) 

и исходные данные (входные данные для tree->db):

(def init-data 
    {:app/session {:id 1 
       :app/messages [{:id 100}]} 
    :app/messages [{:id 100 :text "Message 1"} 
        {:id 101 :text "Message 2"}] 
    :app/users [{:id 200 :email "[email protected]"} 
       {:id 201 :email "[email protected]"}]}) 
+0

Спасибо за это, Крис! Работает как шарм :) –