0

次のような DocPad ドキュメントがあります。

---
categories: [{slug: ""}, {slug: ""}, ...]
---

Document content.

meta.category配列内に定義済みのスラッグ値を持つすべてのドキュメントを照会するにはどうすればよいですか?

4

3 に答える 3

3

これにはいくつかの方法があります。

テンプレート ヘルパーとクエリ エンジン経由setFilter

https://gist.github.com/4556245

最も直接的な方法は、コレクション内の各モデルに対して実行されるカスタム関数 (フィルター) を指定できるgetDocumentsWithCategoryクエリ エンジンの呼び出しを利用するテンプレート ヘルパーを使用するsetFilterことです。そのブール値の戻り値に基づいて、モデルを保持するか、モデルを削除します。コレクション。

このソリューションの欠点は次のとおりです。

  • 各投稿でカテゴリ情報を再定義する必要があります
  • 利用可能なすべてのカテゴリに関する情報をすぐに取得できる方法はありません。

テンプレートヘルパーとparseAfterイベント経由

https://gist.github.com/4555732

利用可能なすべてのカテゴリに関する情報を取得できるようにしたいが、投稿ごとに毎回カテゴリを定義する必要がある場合は、parseAfterイベントを使用してドキュメントのメタデータにフックすることができます。カテゴリをグローバル カテゴリ オブジェクトに出力し、代わりにドキュメントのカテゴリを id 参照で更新します。

欠点は、冗長なカテゴリ情報が必要なことです。

テンプレート ヘルパーとグローバル カテゴリ リスト経由

https://gist.github.com/4555641

カテゴリー情報を 1 回だけ定義して、投稿内のカテゴリー ID を参照するだけであれば、このソリューションが最も理想的です。

于 2013-01-17T14:32:02.163 に答える
1

特定のスラッグ値「バー」の「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)

呼び出そうとすると空のコレクションを取得します。

于 2013-01-16T16:10:27.030 に答える
0

一滴の解決策もありませんが、docpad の作者のブログのソース コードは見ましたか? メタデータ オブジェクト属性の存在を照会する例がいくつかあります。それが役立つことを願っています!

于 2013-01-16T14:32:12.453 に答える