0

假设我有 3 个集合CustomersContactsMessages

Customers {_id, name, address, city, state, zip}
Contacts {_id, customer_id, first_name, last_name, email, phone}
Messages {_id, contact_id, subject, body}

好的,现在我在每个集合上设置了一些属性和方法,以将相关集合作为一个函数引入,该函数可以通过转换直接在文档实例上调用,从而使我能够像{{#each contact}}{{customer.name}}{{/each}}这里一样在模板中进行菊花链这就是我如何改造他们。

Contact.prototype = {
    constructor: Contact,

    customer: function () {
        return Customers.findOne({_id: this.customer_id});
    },

    fullName: function () {
        return this.first_name + " " + this.last_name;
    }, 

    neverContacted: function () {
        if (!Messages.findOne({contact_id: this._id})) {
            return true;
        } else {
            return false;
        };
    }
};

Customer.prototype = {
    constructor: Customer,

    owner: function () {
        user = Meteor.users.findOne({_id: this.user_id});
        return user.username || user.emails[0].address;
    }, 

    contacts: function () {
        contacts = Contacts.find({customer_id: this._id}).fetch();
        return contacts;
    }
};

我的问题是如何根据客户集合的虚拟属性对客户集合进行查询

喜欢customers.find().contacts().neverContacted()

有点像菊花链的主动记录风格?

4

2 回答 2

0

以下是您如何从中获得所有“联系人”的方法,可能是一种低效的方式:

var allContacts = [];
customers.find().forEach(function(customer){ 
     var contacts = customer.neverContacted(); 
     contacts.forEach(function(contact){
          allContacts.push(contact); //You will want to have an if here to check if it already contains that contact already.
     });
});

另外的选择:

setupSearches(customers.find()).contacts()

setupSearches = function(input){
     input.contacts = function () {
        contacts = input.find({customer_id: this._id}).fetch();
        return contacts;
     }
     return input;
}
于 2013-07-02T14:37:14.360 回答
0

可能没有人回答这个问题,因为涉及到很多步骤和不同的方法来解决它。

我可以告诉你如何开始:你需要用一种策略重写你的类,允许你在函数中返回“this”关键字。例如,您可以将结果存储到结果属性中,然后测试是否填充了结果属性以在其他函数中进行操作。

例如

//how you might get the results
customers.find().contacts().neverContacted().result
//in the prototype
contacts: function () {
        this.result = Contacts.find({customer_id: this._id}).fetch();
        return this;
}
//in the other prototype
neverContacted: function () {
    if(this.result){
    // do something special and return
    }
    if (!Messages.findOne({contact_id: this._id})) {
        return true;
    } else {
        return false;
    };
}

其次,您可能需要客户从联系人或相同的基类继承。

完成后,将结果集存储在属性中

这个问题比较混乱,你是在扩展一个集合吗?

然后你可以使用下划线 _.extend()。

更具体的问题,我会尽力给出更好的答案。

于 2013-07-02T14:39:05.073 回答