Фильтрация коллекции Backbone.js

Итак, я могу получить коллекцию из базы данных и отобразить ее, используя этот код:

var articles = new SimpleGoogleReader.Collections.Articles();
articles.fetch({
  success: function(articles){
  var view = new SimpleGoogleReader.Views.ArticlesIndex({model: articles});
  view.render();
  }

});

и это работает просто отлично.

В моих моделях Rails (переключившись на Rails на секунду) у меня есть модель публикации и модель статьи. В каждой публикации много статей, и каждая статья принадлежит одной публикации. Кроме того, у каждой статьи есть столбец publish_id.

Вернемся к магистрали. Теперь я хотел бы получить из Backbone мою коллекцию статей, но только те статьи, которые имеют указанный идентификатор публикации. Вот что у меня есть:

  articles_by_id: function(id){
    var articles = new SimpleGoogleReader.Collections.Articles();
    articles.fetch({
      data: {publication_id: id},
      success: function(x){
        console.log(x);
      }
    });
  }

Это все еще дает мне все статьи, а не отфильтрованную версию, которую я ищу. На данный момент я просто хочу распечатать данные на консоли, чтобы увидеть, получаю ли я правильные данные. Я займусь рендерингом представлений позже.

Есть идеи?


person user2623706    schedule 13.02.2014    source источник


Ответы (2)


Как упомянул Кайл, вам нужно убедиться, что ваш слой «API» Rails поддерживает наличие публикации_id в качестве параметра. Вы можете сделать это либо изменив файл config/routes, либо проверив наличие publication_id в действии Rails.

Например, у вас, вероятно, есть что-то вроде этого:

class ArticlesController < ApplicationController
  def index
    @articles = Article.all
  end
end

просто измените это на:

class ArticlesController < ApplicationController
  def index
    if params[:publication_id]
      @articles = Article.where(:publication_id => params[:publication_id]).all
    else
      @articles = Article.all
    end
  end
end

Это не идиоматично, обычно вы просто применяете where, условно похожие на ответ здесь Как добавить условные предложения where в rails, но в этой ситуации это сработает.

person David    schedule 13.02.2014
comment
Вы, ребята, были правы! И вы только что помогли мне закончить дневную кроличью нору :) - person user2623706; 14.02.2014

Позволяет ли ваш API фильтровать? передача параметров данных просто добавит их в запрос, например, ваш запрос будет выглядеть так.

http://www.yourdomain.com/articles?publication_id=id

Однако вы можете получить их все, а затем отфильтровать клиентскую часть своей коллекции.

  articles_by_id: function(id){
    var articles = new SimpleGoogleReader.Collections.Articles();
    articles.fetch({
      success: function(x){
        console.log(x.where({publication_id: id}));
      }
    });
  }
person Kyle Needham    schedule 13.02.2014
comment
Как мне фильтровать коллекцию со стороны клиента? Я играл с фильтром и функциями из библиотеки подчеркивания, но пока безуспешно. Я мог бы использовать их неправильно, хотя. Есть идеи? - person user2623706; 14.02.2014
comment
@user2623706 user2623706 приведенный выше фрагмент должен console.log отфильтровать коллекцию, изменить атрибуты, которые вы передаете, в зависимости от того, как вы хотите фильтровать коллекцию. - person Kyle Needham; 14.02.2014