Я разрабатываю API, а также использую его с помощью Backbone.js. Часть API будет включать поисковые операции. Например, при поиске автомобилей у меня может быть что-то вроде:
http://api.mysite.com/search/cars?q=volvo
С магистралью я вижу два варианта использования результатов.
Вариант 1: Поиск — это Коллекция
var CarSearch = Backbone.Collection.extend({
model: Car,
initialize : function(models, options){
this.query = options.query;
},
url: function(){
return "http://api.mysite.com/search/cars?q="+this.query;
}
});
var volvos = new CarSearch([], {query:'volvo'});
volvos.fetch();
Вариант 2: Поиск — это Модель, а результаты — Коллекция
var CarSearchResults = Backbone.Collection.extend({
model: Car
});
var CarSearch = Backbone.Model.extend({
defaults: {
"query":"",
"carSearchResults":null
},
url: function(){
return "http://api.mysite.com/search/cars?q="+this.get('query');
},
parse: function(resp,xhr){
resp.carSearchResults = new CarSearchResults(resp.carSearchResults);
return resp;
}
});
var volvoSearch = new CarSearch();
volvoSearch.set({query:'volvo'});
volvoSearch.save();
Каковы преимущества/недостатки этих вариантов? Есть ли магистральный способ проектирования этого?
Я склоняюсь к варианту 2, поскольку мне кажется, что проще добавить в ответ такие элементы, как нумерация страниц или следующий URL. Но вариант 2 кажется более запутанным в нескольких отношениях. Например, буду ли я генерировать идентификатор на сервере для модели поиска при ее сохранении? Не думайте, что мне нужно получить эту модель по идентификатору, удаление или обновление ее также не имеет смысла, потому что я ее не сохраняю.