将行为附加到流星集合的最佳方法是什么?

Sam*_*amo 22 model behavior backbone.js meteor

在Meteor中,当您从数据库中检索记录时,它只是一条记录.因此,如果我有一个名为的集合Dogs,dog可能有fur: 'brown'或者breath: 'stinky',但它没有bark()方法.

显然,我可以创建一些期望dog作为参数然后对其执行操作的函数dog.我甚至可以将所有这些函数封装到一个构造函数中.我对这种方法并不是很疯狂,但是如果某人有一个干净而明智的方法来做到这一点,我就全都听见了.

另一种认为我是包裹dogBackbone.Model.这可能很有趣,因为fetch并且save可以重新定义为find和/ insertupdate,你也可以在那里定义你的所有行为,但我已经读过这种类型的东西通常是不鼓励的.

有没有正确的方法呢?是否有Meteor.Model正式的作品?其他人如何解决这个问题?

编辑

对于那些在接受答案后一年内提出这个问题的人:在编辑时我使用的是Exygy的minimongoid mrt包,它对haihappen版本有一些改进,这个版本在博客文章中提到的链接被接受的答案.

我目前正在为存储库做贡献,使结果集更像关系.希望其他人可以使用它,并倾向于提供有用的功能.

编辑

另一个答案建议transform在创建集合时使用该属性.虽然我肯定更喜欢我自己并不需要自己构建的东西,但这个功能增加了很多可能性,我希望任何正在研究ORM for Meteor的团队都会利用这个核心优势. .

这是一篇博客文章,解释了如何使用该transform属性.

此外,minimongoid现在可用作Meteor包,我仍在使用它.它支持验证和声明关系.我已经为这个软件包添加了一些功能,所以如果一个电路板有很多部分,board.pieces().create(attributes)将保留一个piece给定的新记录attributes并自动关联board.在我看过的各种解决方案中,这似乎是最全面的.

Fla*_*ken 28

您可以使用transformCollection中的参数来使用自定义函数重载对象

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

然后:

var aDogID = new Dogs.insert({barkSound: "ruff"})
Dogs.find(aDogID).bark(); // "ruff"
Run Code Online (Sandbox Code Playgroud)

额外奖励:如果出于任何原因您想使用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);
            }
        });
Run Code Online (Sandbox Code Playgroud)

  • 有关更多示例的主题发布:http://www.okgrow.com/posts/2014/05/19/meteor-transform/ (2认同)

Aks*_*hat 3

虽然官方模型系统可能正在开发中,但您现在可以做一些事情:

Mario Uhler 有一个类似 activerecord 的文档,而且非常好,在 CoffeeScript 中:https://coderwall.com/p/_q9b1w

还有一个由 Tom Coleman 制作的社区包,对模型非常有帮助:https://github.com/tmeasday/meteor-models,您可能需要Meteorite将其添加为包。

当然,正如您建议的 Backbone。我个人使用js原型,但并不是每个人都对它们感到满意,我只是使用它们,这样当流星的模型系统出来时它很容易过渡,它也很容易在客户端和服务器之间共享,而不需要添加太多包。

  • 我不明白为什么集合的转换参数不够。 (2认同)