لماذا ينتج عن البيانات نفس المعرف المؤقت مرتين على التوالي عند التكرار?
سؤال
سيؤدي ذلك إلى إنتاج معرفين مختلفين ، وهو أمر رائع:
#db/id[:db.part/user]
#db/id[:db.part/user]
ولكن أي شيء مثل ما يلي (حاولت الكثير من الأفكار حتى الآن) سوف تنتج نفس معرف مرتين ، وهو ليس ما أريد:
(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])
حيث يكون الرقم الناتج هو نفسه لكل مكالمة.
ما أريده بالفعل هو أن المكالمات لا تنتج رقما على الإطلاق ، حتى أتمكن فقط من إضافة البيانات المنتجة عبر معاملة.
أي أفكار?
فقط لأكون واضحا, الوثائق يقول ، " كل مكالمة إلى تيمبيد تنتج معرف مؤقت فريد."
[تحرير بعد تعليق @ماكسثورسي أن repeat
سيكون لديك هذه المشكلة في أي حال.]
المحلول
استخدام
(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])
النظر في أن #...هي وحدات الماكرو القارئ وهذا يعني أن قيمتها سيتم حلها عند قراءة التعبير الذي يحدث بشكل طبيعي مرة واحدة فقط.استخدم #...ماكرو فقط عند كتابة بيانات المعاملات الحرفية (مثل المخطط).استخدم البيانات.أبي / تيمبيد لتوليد تيمبيد في وقت التشغيل.
نصائح أخرى
لأن التكرار يكرر القيمة التي حصلت عليها من معرف الاتصال مرة واحدة.
استخدم مرارا وتكرارا بدلا من ذلك.
انظر الأمثلة على http://clojuredocs.org/clojure_core/clojure.core/repeatedly