22

Meteorでは、データベースからレコードを取得する場合、それは単なるレコードです。したがって、、というコレクションがある場合、はまたはを持ってDogsいるdog可能性がありますが、メソッドはありません。fur: 'brown'breath: 'stinky'bark()

dog明らかに、引数としてaを期待するいくつかの関数を作成し、それに対して操作を実行することができますdog。これらすべての関数を単一のコンストラクターにカプセル化することもできます。私はこのアプローチに夢中ではありませんが、誰かがそれを行うためのクリーンで賢明な方法を持っているなら、私はすべての耳です。

私が持っていたもう一つの考えは、で包むことでしdogBackbone.Model。これは興味深いかもしれません。また、fetchsave行うように再定義することもできますし、そこですべての動作を定義することもできますが、この種のことは一般的に推奨されないことを読みました。findinsertupdate

それを行う正しい方法はありますか?Meteor.Model正式に作品にありますか?他の人はこの問題をどのように解決していますか?

編集

受け入れられた回答から1年以上後にこの質問に来た人のために:この編集の時点で、私はExygyのミニモンゴイドmrtパッケージを使用しています。これは、受け入れられた回答によってリンクされたブログ投稿に記載されているhaihappenのバージョンにいくつかの改良が加えられています。

私は現在、結果セットをより関係のようにするためにリポジトリに貢献しています。うまくいけば、他の人がそれを利用して、役立つ機能を提供したいと思うようになります。

編集

transformコレクションを作成するときにプロパティを使用することを提案した別の回答。私は自分で構築する必要のないものを絶対に好みますが、この機能は多くの可能性を追加します。MeteorのORMに取り組んでいるチームがコアでこれを利用することを願っています。 。

transformこれは、プロパティの使用方法を説明するブログ投稿です。

また、minimongoidはMeteorパッケージとして利用できるようになり、現在も使用しています。検証と関係の宣言をサポートしています。このパッケージにもいくつかの機能を追加したので、ボードに多くのピースがある場合、指定されboard.pieces().create(attributes)た新しいpieceレコードを保持し、attributes自動的にに関連付けられますboard。私が見たさまざまなソリューションの中で、これは最も包括的なもののようです。

4

6 に答える 6

28

コレクションのパラメーターを使用してtransform、カスタム関数でオブジェクトをオーバーロードできます

var Dogs = new Meteor.Collection("dogs", 
{
    transform:function(entry)
    {
        entry.bark = function(){ console.log(this.barkSound);};
        return entry;
    }
});

それで:

var aDogID = new Dogs.insert({barkSound: "ruff"})
Dogs.find(aDogID).bark(); // "ruff"

ボーナス:何らかの理由でAndrew Ferkが提案したのと同様の概念を使用したい場合は、_。defaults(object、* defaults)関数を使用してください。

var defaults = {
             barkSound: "ruff",
             bark: function() {
                        console.log(this.barkSound);
                    }
            }

Dogs = new Meteor.Collection("dogs",
        {
            transform: function(object) {
                return _.defaults(object, defaults);
            }
        });
于 2014-02-04T07:39:49.950 に答える
4

これは、オブジェクトのメソッドをサポートするためにMeteor.Collectionをオーバーライドすることから始まります。

Meteor.Kollection = Meteor.Collection;
Meteor.Kollection.extend = function(constructor) {
  var parent = this;
  var child = function() {
    Meteor.Kollection.apply(this, arguments);
    constructor.apply(this, arguments);
  };

  _.extend(child, parent);

  function __proto__() { this.constructor = child; };
  __proto__.prototype = parent.prototype;
  child.prototype = new __proto__;

  return child;
};

Meteor.Collection = Meteor.Kollection.extend(function(name, options) {
  if (options && options.defaults) {
    this.defaults = options.defaults;
  }
});

Meteor.Collection.prototype.applyDefaults = function(attrs) {
  return _.defaults(attrs, this.defaults);
};

Meteor.Collection.prototype.create = function(attrs) {
  if (typeof attrs !== "object") attrs = {};
  return this.applyDefaults(attrs);
};

Meteor.Collection.prototype.findOne = function(selector, options) {
  var object = Meteor.Kollection.prototype.findOne.apply(this, arguments);
  return this.applyDefaults(object);
};

新しいコレクション.createメソッドに気付くかもしれませんが、そのコレクション.findOneがオーバーライドされています。すべてのコレクション。*メソッドをオーバーライドする必要があると思いますが、これは始まりです。

では、これで何ができるでしょうか?

var Dogs = new Meteor.Collection("dogs", { defaults: {
  barkSound: "ruff",
  bark: function() {
    console.log(this.barkSound);
  }
}});

if (Meteor.isClient) {
  var regularDog = Dogs.create();
  regularDog.bark(); // ruff

  var smallDog = Dogs.create({
    barkSound: "yip"
  });
  smallDog.bark(); // yip

  Dogs.insert(smallDog, function(error, id) {
    Dogs.findOne(id).bark(); // yip
  });
});

これがどのように発生するかは正確にはわかりませんが、オブジェクト内の関数は挿入されると削除されます。したがって、メソッドをオブジェクトに直接適用できます。まず、defaultsプロパティを持つオブジェクトを渡してコレクションを作成します。このプロパティには、プロパティまたはメソッドを含めることができます。特定のコレクションの新しいオブジェクトを作成するには、collection .create(attrs)を使用します。ここで、attrsは、追加またはオーバーライドされたプロパティとメソッドを含むオプション引数です。

于 2013-02-21T21:56:06.117 に答える
4

天文学は、Meteorモデルのこの古い質問に対する新しい答えです。作者は、他の著名なMeteorパッケージ作者の作業とサポートで、さらに多くの機能を計画しています。唯一の欠点は、おそらくそれが少し最先端であるということです。

天文学も高度にモジュール化されており、流星のパッケージ化/モジュール化されたスタイルで構築するための代表的な例です。

于 2015-08-20T01:53:58.950 に答える
3

作品には公式のモデルシステムがあるかもしれませんが、今できることがいくつかあります。

マリオ・ウーラーによるものがあります。これは、coffeescriptのようにactiverecordのようで、非常に優れています:https ://coderwall.com/p/_q9b1w

モデルに非常に役立つTomColemanによって作成されたコミュニティパッケージもあります:https ://github.com/tmeasday/meteor-models、パッケージとして追加するには隕石が必要な場合があります。

そしてもちろん、あなたがバックボーンを提案したように。私は個人的にjsプロトタイプを使用していますが、誰もがそれらに満足しているわけではありません。meteorのモデルシステムがリリースされたときに簡単に移行できるように使用しました。また、追加するパッケージが多すぎることなく、クライアントとサーバー間で簡単に共有できます。

于 2013-02-21T16:52:17.847 に答える
2

これはMeteorに関しては比較的古い質問ですが、dburles:collection-helpersは、Flavien Volkenが提案したことを実装することで、達成したいことの法案に適合していると思います。たぶん、最近ここをさまよっている人には便利でしょう。

于 2015-04-02T17:04:20.590 に答える
0

@Flavien Volkenの回答に追加すると、コレクションに追加したメソッドに引数を渡すことができます。

Car = new Mongo.Collection('car', {
    transform: function(entry) {
        entry.is_watched = function(userId) {
            var is_watched = false;
            if (entry.watchList) {
                for (var i in entry.watchList) {
                    if (entry.watchList[i].userId == userId) {
                        is_watched = true;
                        break;
                    }
                }
            }
            return is_watched;
        };
        return entry;
    }
});

テンプレート内(ログインしたユーザーのIDを渡す):

{{# if is_watched currentUser._id }}
    Watched
{{ else }}
    Not watched
{{/ if }}
于 2015-09-21T05:44:47.887 に答える