2017-07-12 15 views
1

既存のClojureデータからエンティティを作成できます。しかし、私は作成しようとしているエンティティに既存のエンティティを付けることができません。スキーマ内に:ref :oneがある場合は、eidまたは:db/idを配置できますか?私は両方を試しましたが、エラーメッセージだけを受け取りました。次のコードで:statement/bank-accountのスキーマを:ref :oneとして定義され、read-account機能が正常に既存の(銀行)口座エンティティを取り出している。既存のエンティティを参照するエンティティを作成する

(defn read-account [conn account-name] 
    (let [db (d/db conn)] 
    (d/q '[:find ?a 
      :in $ ?an 
      :where 
      [?a :account/name ?an] 
      ] db account-name))) 

(defn make-statement [conn {:keys [bank-acct-name]}] 
    (let [db (d/db conn) 
     bank-acct-id (->> bank-acct-name 
          (read-account conn) 
          ;; (d/pull db [:db/id]) 
          first 
         )] 
    {:db/id     (d/tempid :db.part/user) 
    :base/type    :statement 
    :statement/bank-account bank-acct-id 
    })) 

このコードはIllegalArgumentExceptionInfo :db.error/invalid-lookup-ref Invalid list form: [17592186045426] datomic.error/arg (error.clj:57)を与えます。私がfirstをコメントアウトすると、まったく同じエラーメッセージが表示され、私には困惑します。私が(d/pull db [:db/id])のコメントを外したら、私はIllegalArgumentExceptionInfo :db.error/not-an-entity Unable to resolve entity: :db/id datomic.error/arg (error.clj:57)を得る。

編集この質問に回答する過程で、私はeid:db/idが同じことを発見しました。 「この関数が何を、あなたはおそらくドンについて

[:find ?a . ;; mind the '.' 
:in $ ?an 
:where 
[?a :account/name ?an] 
] 

答えて

1

あなたのクエリは、例えば#{[1] [42] [323142] ...}

、1タプルの集合を返すあなたは一つの値だけを返すようにそれを変更したいと思いますプルを使用する必要がありません - それだけでeidが十分です。

+0

セットまたはベクターを渡すかどうかにかかわらずエラーメッセージが同じでない場合は、エラーメッセージに「セットを渡す」と表示された場合のように、「first」を使用したときのエラーメッセージは ' t 'を渡すと、私は 'ffirst'になってしまい、この質問を全く聞く必要はありませんでした。 –

+0

エラーメッセージを出さなかったので、最初の 'ffirst'の代わりに –

+0

' ffirst'をうまく動作させるには、d/pullの上流で 'ffirst'を使う必要がありました。これは 'eid'がベクトルにあるので私には意味があります。 1つの実験を除いてすべての方法でコメントアウトされ、そのままになった「プル」とは関係ありません。 –

関連する問題