This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-05-02
Channels
- # admin-announcements (4)
- # aleph (10)
- # arachne (1)
- # beginners (66)
- # boot (19)
- # cider (6)
- # cljs-edn (2)
- # cljs-site (32)
- # cljsjs (4)
- # cljsrn (32)
- # clojure (116)
- # clojure-austin (6)
- # clojure-belgium (2)
- # clojure-dusseldorf (1)
- # clojure-russia (16)
- # clojure-uk (5)
- # clojurescript (178)
- # community-development (2)
- # cursive (28)
- # datascript (16)
- # datomic (16)
- # dirac (13)
- # editors (2)
- # emacs (1)
- # error-message-catalog (30)
- # events (3)
- # garden (2)
- # hoplon (27)
- # jobs (4)
- # ldnclj (4)
- # liberator (3)
- # off-topic (6)
- # om (49)
- # onyx (24)
- # parinfer (9)
- # re-frame (59)
- # reagent (46)
- # remote-jobs (1)
- # rethinkdb (4)
- # rum (2)
- # slack-help (11)
- # untangled (13)
when transacting and entity which has a db.cardinality/many
, it seems that the entities are only being added, and not removed, is that expected? example coming up
(ns ds.core
(:require [datascript.core :as d]))
(def schema {:user/id {:db/unique :db.unique/identity}
:user/name {}
:user/buddies {:db/cardinality :db.cardinality/many}})
(def conn (d/create-conn schema))
(d/transact! conn [{:user/id "1" :user/name "test"}
{:user/id "2" :user/name "what?"}
{:user/id "3" :user/name "hello"}
{:user/id "4" :user/name "when"}])
(:user/buddies (d/entity @conn [:user/id "1"])) ;; => nil
(d/transact! conn [{:user/id "1"
:user/buddies [[:user/id "2"]]}])
(:user/buddies (d/entity @conn [:user/id "1"])) ;; => #{[:user/id "2"]}
(d/transact! conn [{:user/id "1"
:user/buddies [[:user/id "3"]]}])
(:user/buddies (d/entity @conn [:user/id "1"])) ;; => #{[:user/id "3"] [:user/id "2"]}
nice, thanks @ckarlsen , what are you expected to in such cases? .. other than writing your own tx, must be a general use case .. right?
@ckarlsen: this is what I came up with
(defn update-users [conn id new-users]
(let [e (d/entity conn [:user/id id])
new (set (map #(d/entity conn [:user/id %]) new-users))
existing (:user/buddies e)
joining (set/difference new existing)
leaving (set/difference existing new)]
(concat
(map #(vector :db/add (:db/id e) :user/buddies (:db/id %)) joining)
(map #(vector :db/retract (:db/id e) :user/buddies (:db/id %)) leaving))))
(defn set-users [id users]
(d/transact! conn [[:db.fn/call update-users id users]]))
(set-users "1" ["3"])