2017-10-22 5 views
4

私のデータベースは、アイテムのテーブルと関連する広告のテーブルで構成されています。Elmのモデリング関連が依存関係のサイクルにつながる

私のelmアプリには、関連する広告を含むアイテム、または親アイテムに関する情報を含む広告が表示されます。

module Item.Model exposing (..) 

import Ad.Model exposing (Ad) 

type alias Item = 
    { ads : Maybe List Ad 
    } 

module Ad.Model exposing (..) 

import Item.Model exposing (Item) 

type alias Ad = 
    { item : Maybe Item 
    } 

をこの定義は、しかし、その結果:これらのインタフェースのニーズに合うように

、私は私のAPIがすでに送信どのようなマッチング、ニレ、次の2つのモジュールを書くことが好きだろう次の依存関係サイクルエラー:

ERROR in ./elm-admin/Main.elm 
Module build failed: Error: Compiler process exited with error Compilation failed 
Your dependencies form a cycle: 

    ┌─────┐ 
    │ Item.Model 
    │  ↓ 
    │ Ad.Model 
    └─────┘ 

You may need to move some values to a new module to get rid of the cycle. 

    at ChildProcess.<anonymous> (/opt/app/assets/node_modules/node-elm-compiler/index.js:141:27) 
    at emitTwo (events.js:106:13) 
    at ChildProcess.emit (events.js:191:7) 
    at maybeClose (internal/child_process.js:886:16) 
    at Socket.<anonymous> (internal/child_process.js:342:11) 
    at emitOne (events.js:96:13) 
    at Socket.emit (events.js:188:7) 
    at Pipe._handle.close [as _onclose] (net.js:497:12) 
@ ./js/admin.js 3:12-44 

同じモジュール内にtype aliasを定義してもコンパイラは停止しませんが、これは私のアプリケーションのすべてModelが同じファイルになることを望まないため、私にとって満足のいく解決策ではありません。

同じモジュール内に2種類のエイリアスAdItemを定義しないと解決できますか?

+0

完全性のためにエラーメッセージを追加してください – ZhekaKozlov

+0

私は完全なエラーメッセージ – AlexHv

答えて

5

私はあなたがポーズを質問への迅速な解決策を考えることはできませんが、私はそのようにデータを保存しないだろう - 私はあなたが、代わりに

module Item.Model exposing (..) 

type alias Items = Dict String Item 

type alias Item = 
    { ads : List String 
    } 
    -- you don't need a Maybe and a List 
    -- as the absence of data can be conveyed by the empty list 

module Ad.Model exposing (..) 

import Item.Model exposing (Item) 

type alias Ads = Dict String Ad 

type alias Ad = 
    { itemKey : Maybe String 
    } 

をポインタを使用します何かのようになる可能性があります

model.ads 
    |> L.filterMap (\key -> Dict.get key model.items) 
    |> ... 

model.itemKey 
    |> Maybe.andThen (\itemKey -> Dict.get itemKey model.ads) 
    |> ... 

このようなアプローチは機能し、またメモ帳n続いて

+0

で質問を更新しました。もう1つの問題がさらに現れます:「HTTP.request」にはデコーダが必要です。私は、モデルとモデルを更新することができるように、このデコーダーに広告付きの 'Item'と' Ads'のリストを生成する必要があります。私は新しい 'Type Alias DecodedItem = {ads:List Ad、item:Item}'とそれを得るためのデコーダを定義することができましたが、このデコーダを定義する方法を理解するのはまだ苦労しています。 – AlexHv

+0

これは問題ありません。両方のモデルをインポートするモジュールにそれらを入れる –

関連する問題