Clojure 即使基数为/1,枚举类型也不会覆盖

Clojure 即使基数为/1,枚举类型也不会覆盖,clojure,enums,datomic,Clojure,Enums,Datomic,在编写评级系统时,我希望人们能够对帖子进行评级,但我只希望每个用户有一个评级 所以在我的模式中,我有 {:db/id #db/id[:db.part/db -1] :db/ident :rating/value :db/valueType :db.type/ref :db/cardinality :db.cardinality/one <<thinking this serves a purpose :db/doc "rating applied to this part

在编写评级系统时,我希望人们能够对帖子进行评级,但我只希望每个用户有一个评级

所以在我的模式中,我有

{:db/id #db/id[:db.part/db -1] 
 :db/ident :rating/value
 :db/valueType :db.type/ref
 :db/cardinality :db.cardinality/one  <<thinking this serves a purpose
 :db/doc "rating applied to this particular post"
 :db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/user -2] 
 :db/ident :rating.value/verypositive}

{:db/id #db/id[:db.part/user -3]
 :db/ident :rating.value/positive}

{:db/id #db/id[:db.part/user -4]
 :db/ident :rating.value/needswork}
({:bid 1759,
  :rating :rating.value/verypositive
  :email "sova@web"}
 {:bid 1759,
  :rating :rating.value/positive,
  :email "sova@web"}
 {:bid 1759,
  :rating :rating.value/needswork,
  :email "sova@web"})
该事务工作正常,但当我查询附加到特定eid后的评级时,我得到如下结果

{:db/id #db/id[:db.part/db -1] 
 :db/ident :rating/value
 :db/valueType :db.type/ref
 :db/cardinality :db.cardinality/one  <<thinking this serves a purpose
 :db/doc "rating applied to this particular post"
 :db.install/_attribute :db.part/db}

{:db/id #db/id[:db.part/user -2] 
 :db/ident :rating.value/verypositive}

{:db/id #db/id[:db.part/user -3]
 :db/ident :rating.value/positive}

{:db/id #db/id[:db.part/user -4]
 :db/ident :rating.value/needswork}
({:bid 1759,
  :rating :rating.value/verypositive
  :email "sova@web"}
 {:bid 1759,
  :rating :rating.value/positive,
  :email "sova@web"}
 {:bid 1759,
  :rating :rating.value/needswork,
  :email "sova@web"})
真的,我想要的是最新的一个,所以返回一个列表,列出一个用户提交给我的所有评分(最后一个x),那就太好了

…但它将一直填充,直到每个枚举类型都有一个,然后忽略添加

有什么建议可以帮助我实现我所追求的行为吗


事先非常感谢

您的模式目前的基本意思是,每个评级只允许一个值。值

我建议,“每个用户的单个评级”不应该是一个模式约束,而是一个域级别的问题-实现这一点的适当方法是允许每个用户的每个帖子有多个评级,然后编写一个事务处理函数,检查用户是否在之前对帖子进行过评级,或者拒绝评级再次,或收回旧评级(取决于您想要的行为)


如果你还没有这样做的话,你也会希望将评级本身作为一个实体来对待。因此,您具有
:rating/post:ref
:rating/value:ref
:rating/email
属性,并为每个评级创建一个新实体。

您的模式是正确的。您对枚举使用的标识是正确的

不要每次都创建一个新的评级实体,而是使用查询来检查是否已经有一个评级实体具有评级
:bid
和评级用户
:email
。如果是这样,使用
:db/add
断言处理新的
:rating
属性(不要担心收回,它们是为
:cardinality/one
属性隐式创建的)。如果没有,创建一个你已经在做的

如果你需要原子化,例如。G为了避免同一用户在竞争条件下对一篇文章创建两个评级实体,您需要在事务处理程序中通过编写和使用


如果您需要查看用户给出的所有评分,请使用类似的功能来查询实体的
:rating
值随时间的变化。

似乎实现我想要的效果的最佳方法是:收回已经存在的评分/值,以便一次只有一个。感谢您抽出时间阅读我的问题。我猜枚举类型还有其他潜在的用途,这并不是其中之一。