(batched-hydrate model k rows)(can-hydrate-with-strategy? model strategy k)(fk-keys-for-automagic-hydration original-model dest-key hydrated-model)(hydrate results k & ks)Hydrate a single object or sequence of objects.
[[toucan2.hydrate/hydrate]] attempts to do a batched hydration where possible. If the key being hydrated is
defined as one of some table's [[toucan2.hydrate/model-for-automagic-hydration]], hydrate will do a batched
toucan2.select/select if a corresponding key (by default, the same key suffixed by -id) is found in the
objects being batch hydrated. The corresponding key can be customized by
implementing [[toucan2.hydrate/fk-keys-for-automagic-hydration]].
(hydrate [{:user_id 100}, {:user_id 101}] :user)
Since :user is a hydration key for :models/User, a single toucan2.select/select will used to fetch Users:
(db/select :models/User :id [:in #{100 101}])
The corresponding Users are then added under the key :user.
If the key can't be hydrated auto-magically with the appropriate [[toucan2.hydrate/model-for-automagic-hydration]], [[toucan2.hydrate/hydrate]] will attempt to do batched hydration if it can find a matching method for [[toucan2.hydrate/batched-hydrate]]. If a matching function is found, it is called with a collection of objects, e.g.
(m/defmethod hydrate/batched-hydrate [:default :fields] [_model _k rows] (let [id->fields (get-some-fields rows)] (for [row rows] (assoc row :fields (get id->fields (:id row))))))
If the key is not eligible for batched hydration, [[toucan2.hydrate/hydrate]] will look for a matching
[[toucan2.hydrate/simple-hydrate]] method. simple-hydrate is called with a single row.
(m/defmethod simple-hydrate [:default :dashboard] [_model _k {:keys [dashboard-id], :as row}] (assoc row :dashboard (select/select-one :models/Dashboard :toucan/pk dashboard-id)))
You can hydrate several keys at one time:
(hydrate {...} :a :b) -> {:a 1, :b 2}
You can do recursive hydration by listing keys inside a vector:
(hydrate {...} [:a :b]) -> {:a {:b 1}}
The first key in a vector will be hydrated normally, and any subsequent keys will be hydrated inside the corresponding values for that key.
(hydrate {...} [:a [:b :c] :e]) -> {:a {:b {:c 1} :e 2}}
Hydrate a single object or sequence of objects.
#### Automagic Batched Hydration (via [[toucan2.hydrate/model-for-automagic-hydration]])
[[toucan2.hydrate/hydrate]] attempts to do a *batched hydration* where possible. If the key being hydrated is
defined as one of some table's [[toucan2.hydrate/model-for-automagic-hydration]], `hydrate` will do a batched
[[toucan2.select/select]] if a corresponding key (by default, the same key suffixed by `-id`) is found in the
objects being batch hydrated. The corresponding key can be customized by
implementing [[toucan2.hydrate/fk-keys-for-automagic-hydration]].
(hydrate [{:user_id 100}, {:user_id 101}] :user)
Since `:user` is a hydration key for `:models/User`, a single [[toucan2.select/select]] will used to fetch Users:
(db/select :models/User :id [:in #{100 101}])
The corresponding Users are then added under the key `:user`.
#### Function-Based Batched Hydration (via [[toucan2.hydrate/batched-hydrate]] methods)
If the key can't be hydrated auto-magically with the appropriate [[toucan2.hydrate/model-for-automagic-hydration]],
[[toucan2.hydrate/hydrate]] will attempt to do batched hydration if it can find a matching method
for [[toucan2.hydrate/batched-hydrate]]. If a matching function is found, it is called with a collection of
objects, e.g.
(m/defmethod hydrate/batched-hydrate [:default :fields]
[_model _k rows]
(let [id->fields (get-some-fields rows)]
(for [row rows]
(assoc row :fields (get id->fields (:id row))))))
#### Simple Hydration (via [[toucan2.hydrate/simple-hydrate]] methods)
If the key is *not* eligible for batched hydration, [[toucan2.hydrate/hydrate]] will look for a matching
[[toucan2.hydrate/simple-hydrate]] method. `simple-hydrate` is called with a single row.
(m/defmethod simple-hydrate [:default :dashboard]
[_model _k {:keys [dashboard-id], :as row}]
(assoc row :dashboard (select/select-one :models/Dashboard :toucan/pk dashboard-id)))
#### Hydrating Multiple Keys
You can hydrate several keys at one time:
(hydrate {...} :a :b)
-> {:a 1, :b 2}
#### Nested Hydration
You can do recursive hydration by listing keys inside a vector:
(hydrate {...} [:a :b])
-> {:a {:b 1}}
The first key in a vector will be hydrated normally, and any subsequent keys will be hydrated *inside* the
corresponding values for that key.
(hydrate {...}
[:a [:b :c] :e])
-> {:a {:b {:c 1} :e 2}}(hydrate-with-strategy model strategy k rows)(hydration-strategy model k)(model-for-automagic-hydration original-model k)The model that should be used to automagically hydrate the key k in instances of original-model.
(model-for-automagic-hydration :some-table :user) :-> :myapp.models/user
The model that should be used to automagically hydrate the key `k` in instances of `original-model`. (model-for-automagic-hydration :some-table :user) :-> :myapp.models/user
(simple-hydrate model k row)Implementations should return a version of map row with the key k added.
Implementations should return a version of map `row` with the key `k` added.
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |