gpt4 book ai didi

clojure - 根据字符串类名创建记录

转载 作者:行者123 更新时间:2023-12-04 08:30:50 24 4
gpt4 key购买 nike

我正在尝试创建一个事件存储,其中有一张类似于这样的表:

CREATE TABLE domain_events (
id serial PRIMARY KEY,
timestamp timestamptz,
entity_id int,
type text,
data jsonb
);
我有一个命名空间
(ns my-domain.domain-events)

(defrecord PurchaseOrderCreated
[id timestamp purchase-order-id created-by])

(defrecord PurchaseOrderCancelled
[id timestamp purchase-order-id cancelled-by])
所以 type是全限定类名的字符串名称,类似于 my_domain.domain_events.PurchaseOrderCreated ,这来自于获取 type从记录例如 (type (->PurchaseOrderCreated)) .我应该注意到 (type the-event)实际上产生一个前缀为 class 的字符串如 class my_domain.domain_events.PurchaseOrderCreaated所以我在将其存储在数据库中之前将其修剪掉。
我试图弄清楚如何从数据库中检索这些事件行并将它们重新水化为域事件。我觉得我很接近,但只是无法获得所有的碎片。
我试过使用 new构造一个新记录,但我似乎很难将字符串类名转换为记录。
(new (resolve (symbol "my_domain.domain_events.PurchaseOrderCreated")) prop1 prop2 ...)
另外,我不确定使用起来有多容易 new因为我的 array-of-properties将需要按正确的顺序排列。使用 map->PurchaseOrderCreated 可能更好但我仍然不确定如何根据字符串类名动态解析此构造函数。
任何人都可以就这里最好的方法提出建议吗?

最佳答案

以下应该有效,但我没有展示是否有更惯用的方式:

((resolve (symbol "my_domain.domain_events"
(str "map->"
"PurchaseOrderCreated")))
{:id 123})

symbol拍可以拍 ns :
https://clojuredocs.org/clojure.core/symbol

关于clojure - 根据字符串类名创建记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65029492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com