次のような DocPad ドキュメントがあります。
---
categories: [{slug: ""}, {slug: ""}, ...]
---
Document content.
meta.category
配列内に定義済みのスラッグ値を持つすべてのドキュメントを照会するにはどうすればよいですか?
次のような DocPad ドキュメントがあります。
---
categories: [{slug: ""}, {slug: ""}, ...]
---
Document content.
meta.category
配列内に定義済みのスラッグ値を持つすべてのドキュメントを照会するにはどうすればよいですか?
これにはいくつかの方法があります。
setFilter
https://gist.github.com/4556245
最も直接的な方法は、コレクション内の各モデルに対して実行されるカスタム関数 (フィルター) を指定できるgetDocumentsWithCategory
クエリ エンジンの呼び出しを利用するテンプレート ヘルパーを使用するsetFilter
ことです。そのブール値の戻り値に基づいて、モデルを保持するか、モデルを削除します。コレクション。
このソリューションの欠点は次のとおりです。
parseAfter
イベント経由https://gist.github.com/4555732
利用可能なすべてのカテゴリに関する情報を取得できるようにしたいが、投稿ごとに毎回カテゴリを定義する必要がある場合は、parseAfter
イベントを使用してドキュメントのメタデータにフックすることができます。カテゴリをグローバル カテゴリ オブジェクトに出力し、代わりにドキュメントのカテゴリを id 参照で更新します。
欠点は、冗長なカテゴリ情報が必要なことです。
https://gist.github.com/4555641
カテゴリー情報を 1 回だけ定義して、投稿内のカテゴリー ID を参照するだけであれば、このソリューションが最も理想的です。
特定のスラッグ値「バー」の「foo」コレクションを作成することに成功しましたdocpad.coffee
:
collections:
foo: (database) ->
database.findAllLive().setFilter("search", (model, value) ->
categories = model.get('categories')
return false unless Array.isArray categories
for category in categories
if (category.slug and category.slug == value)
return true
return false
).setSearchString("bar")
しかし、オブジェクトの配列メタ (「categories」)、キー (「slug」)、および値 (「bar」) を指定してコレクションを返すヘルパー関数を作成しようとすると、次のようになります。
createCollection: (meta, key, value) ->
result = @getDatabase().createLiveChildCollection()
.setFilter("search2", (model, searchString) ->
objects = model.get(meta)
return false unless Array.isArray objects
for object in objects
if (object[key] and object[key] == searchString)
return true
return false
).setSearchString(value)
呼び出そうとすると空のコレクションを取得します。
一滴の解決策もありませんが、docpad の作者のブログのソース コードは見ましたか? メタデータ オブジェクト属性の存在を照会する例がいくつかあります。それが役立つことを願っています!