2016-11-25 5 views
0

В моем маршруте приложения я получаю текущий сеанс и пользователя.Получение записей по атрибуту в ember

/routes/application.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 

    beforeModel: function() { 
     return this.get('session').fetch().catch(function() {}); 
    }, 
    model() { 
     return this.store.findRecord('user', this.get('session.currentUser.uid')); 
    } 
}); 

Мои модели устанавливаются следующим образом:

/models/bet.js

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    created: DS.attr('date'), 
    user: DS.belongsTo('user', { async: false }) 
}); 

/модели/user.js

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    email: DS.attr('string'), 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 
    bets: DS.hasMany('bet', { async: true }) 
}); 

В моем/пари маршрута я хотел бы загрузить только те ставки, где user == session.currentUser.uid или подобный способ получить только bets что belongTo текущий пользователь.

Я пробовал найти лучший способ сделать это безрезультатно.

+0

Я не уверен, что именно ваша проблема здесь, но есть йо u попытался зарегистрировать сеанс? 'session: Ember.inject.service()' перед вызовом 'beforeModel' – Beno

ответ

1

Подход niave заключается в том, чтобы отфильтровать все ставки только теми, которые вы хотите. Решение на основе api может быть 1) Использовать параметры запроса в запросе на сервер, 2) вложенные URL-адреса, например /users/2/bets. В любом случае вам придется реализовать это на сервере.

Пример 1) Фильтр

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model() { 
    return this.store.findAll('bet').then((bets) => { 
     const currentUserId = this.get('session.currentUser.uid') 
     return bets.filter((bet) => { 
     return bet.get('user.id') === currentUserId 
     }) 
    }); 
    } 
}); 

Пример 2) запроса. Вашему серверу необходимо будет принять ответ

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model() { 
    return this.store.query('bet', { 
     userId: this.get('session.currentUser.uid') 
    }) 
    } 
}); 

Пример 3) Вложенные атрибуты. Для этого вам нужно 2 вещи:

  1. пользователь приходит с атрибутом links, как это: `{ставки:«апи/пользователей /: UID/ставки»}
  2. Ваш сервер должен будет быть в состоянии ответить на запрос /api/users/:uid/bets и возвращать только ставки для пользователя

код:

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model() { 
    const currentUser this.store.peekRecord('user', this.get('session.currentUser.uid')) 
    return currentUser.get('bets') // sends request to `api/users/:uid/bets` 
    } 
}); 
+0

Я действительно решил это так же, как ваше второе решение, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Я использую Firebase и не понимаю, что запрос работал несколько иначе. Я ничего не делаю с 'beforeModel'. 'model() { var user = this.get ('session.currentUser.uid'); return this.store.query ('bet', {orderBy: 'user', equalTo: user}); } ' – Lehar001

0

Вы используете Ember Simple Auth? Если это так, ваши запросы отправляют токен, который можно использовать для извлечения текущего пользователя на основе предоставленной информации. Поскольку поведение по умолчанию возвращает только ставки текущих пользователей, рекомендуется придерживаться логики на стороне api. Любой другой тип фильтра должен выполняться с помощью методов query или queryRecord.

 Смежные вопросы

  • Нет связанных вопросов^_^