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