如何使用hasMany关联过滤记录

时间:2015-09-02 22:17:25

标签: ember.js ember-data

试图找出应该是一个简单的解决方案:filterBy使用hasMany id数组记录。

我有一个模型this.store.createRecord('conversation', {user: model}) .save() .then(function(conversation) { model.get('conversations').addObject(conversation); }); Language hasMany s,反之亦然。从Provider的集合中,我需要Provider甚至filterBy('language', [1,2])

(我不能做一个language.get('providers'),因为我从另一个协会获得了Providers的集合。)

filterBy('language', 2)

2 个答案:

答案 0 :(得分:0)

filterBy基于单个属性的过滤器,但您可以使用filter本身,并将其传递给选择函数:

filteredProviders: function() {
  let providers = this.get('providers');   // some providers to select from
  let languages = this.get('languages');   // array of languages to select

  // Does a provider have one of the languages we're looking for?
  function providerHasLanguage(provider) {
    return provider.get('languages') . 
      some(language => languages.indexOf(language) !== -1;
  }

  return providers . filter(providerHasLanguage);
}.property('providers', 'languages')

答案 1 :(得分:0)

所以一些redditors帮助我,我从那里开始工作。似乎没有本机解决方案,但迭代遍历每个数组并从匹配对象渲染新数组。

// app/utils/where.js
let where = function(sourceArray, property, language_id) {
  let destArray = [];

  sourceArray.forEach(function(obj) {
    obj.get(property).forEach(function(property_object) {
      let id = parseInt(property_object.get('id'));
      if (language_id === id) {
        destArray.push(obj);
      }
    });
  });
  return destArray;
}

export default where;

及其用法:

// in a component
import where from 'path';

let filteredProviders =  where(providers, 
    'languages', language_id);

需要进行少量修改以适应多个language_ids数组的过滤。