Clojure で appengine-magic を使用して Google App Engine データストアで動作するように、crud 関数のボイラープレートを生成しようとしています。以下で再現したモデルから値を生成する方法がわかりません。
(def *model* {:users [{:name "Adam"
:email "adam@gmail.com"
:registered-on "07-05-2011"}
{:name "Greg"
:email "gregory@gmail.com"
:registered-on "11-05-2011"}]
:post [{:title "A"
:authour "Adam"}
{:title "B"
:author "Greg"}]})
私は appengine-magic にかなり慣れていませんが、データストアに入れて保存できるエンティティを定義できる防御機能を提供します! これにより、事前定義されたエンティティをデータストアに保存できます。
これらは次の形式を取ります。
(ds/defentity Post [title author])
(ds/save! (Post. title author))
まず始めに、次のように定義しました。
(defn list-entities [model]
"Takes a representation of the model and lists the entities in preparation for generating defentities"
(interleave (vec (map first (partition 1 (map (comp symbol capitalize #(str % ".") name) (keys model)))))
(map vec (map keys (map first (vals model))))))
次のように呼び出します。
(list-entities *model*)
出力:
(Users. [:name :email :registered-on] Post. [:title :author])
現在、上記の出力を取得し、モデルに必要な数のエンティティを定義する ds/defentities を繰り返し呼び出す gen-entities を定義するのに苦労しています。
(defmacro gen-entities [entity fields]
`(ds/defentity 'entity 'fields))
さらに、これがこの問題を解決するための合理的な方法であるとは確信していません。私はまだマクロに非常に慣れていないため、おそらくいくつかの間違いを犯しています。任意のヘルプ/明確さをいただければ幸いです。
ノート:
私が気付いたそのモデルは設計が不適切であり、以下のモデルははるかに優れています。
(def *model* {:users [:name :email :registered-on]
:post [:title :author]})
ただし、マクロを書くという点ではより複雑なので、そのままにしておきます。