DatoMicは、繰り返しのときに同じ一時的なIDを2回行に2回渡しますか?
質問
これは2つの異なるIDを生成します。これは素晴らしいです:
#db/id[:db.part/user]
#db/id[:db.part/user]
.
しかし、次のようなものは、(これまでのところ多くのアイデアを試してみました)は同じIDを2回作ります。これは私が欲しいものではありません:
(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])
.
すべてのものは
のようなものを収集します(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])
.
それぞれの呼び出しごとに生成された数が同じです。
実際に欲しいのは、呼び出しが全く数を生成しないようにすることであるため、トランザクションを介して生成されたデータを追加することができます。
任意のアイデア?
明確にするためだけに、ドキュメントは、「Tempidへの各呼び出しは一意の一時的なものを生成します。ID。 "
[repeat
がどの場合にもこの問題を抱えていることを@MaxThoursieでコメント後に編集しました。]
解決
を使用
(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])
.
#...は、その値が一度だけ当然起こるときにその値が読まれるときにそれらの値が解決されることを意味します。リテラルトランザクションデータを書いているときだけ(スキーマのように)#...マクロを使用してください。実行時にTempidsを生成するには、datomic.api / tempidを使用します。
他のヒント
繰り返しは、IDを1回呼び出すことから得た値を繰り返しています。
代わりに繰り返し使用してください。
http://clojuredocs.org/clojure.core/clojure.core/RepeatedLy (/crojure.core/RepeatedLy./a>
所属していません StackOverflow