2012-06-19 16 views
15

के साथ एक आरईएसटी खोज कैसे डिजाइन करें मैं एक एपीआई डिजाइन कर रहा हूं और इसे बैकबोन.जेएस के साथ भी उपभोग कर रहा हूं। एपीआई के भाग में खोज परिचालन शामिल होंगे।रीढ़ की हड्डी

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 की तरफ झुक रहा हूं क्योंकि पेजिंग विवरण, या अगली यूआरएल जैसी प्रतिक्रियाओं में चीज़ों को जोड़ना आसान लगता है। लेकिन विकल्प 2 कुछ तरीकों से गड़बड़ लगता है। उदाहरण के लिए, क्या मैं सहेजे जाने पर खोज मॉडल के लिए सर्वर पर एक आईडी उत्पन्न करूंगा? मुझे नहीं लगता कि मुझे आईडी द्वारा उस मॉडल को प्राप्त करने, हटाने या अपडेट करने की आवश्यकता है, वास्तव में यह समझ में नहीं आता है क्योंकि मैं इसे जारी नहीं रख रहा हूं।

उत्तर

5

मैं विकल्प विकल्प के साथ जाऊंगा। कम से कम आईएमओ एक मॉडल को एक खोज परिणाम और खोज परिणामों के पूरे सेट में संग्रह के अनुरूप होना चाहिए। इसलिए यदि आप वोल्वो की खोज करते हैं और 6 आइटम लौटाए जाते हैं, तो प्रत्येक आइटम आपके संग्रह में निहित मॉडल होना चाहिए।

अब यह बड़े पैमाने पर इस बात पर निर्भर करेगा कि आप अपने सर्वर पर परिणाम का प्रतिनिधित्व कैसे कर रहे हैं। उदाहरण के लिए यदि आपके पास कार के उदाहरण हैं तो आप क्वेरी का उपयोग करके खोज सर्वर पक्ष करते हैं और परिणामस्वरूप ऑब्जेक्ट्स जेसन के रूप में वापस कर देते हैं। फिर आप लौटाई गई सूची कार मॉडलों का संग्रह हो सकते हैं जो मानदंडों से मेल खाते हैं। लेकिन अगर आप क्वेरी परिणाम लौटने की योजना बना रहे किसी अन्य तरह से तो आप कैसे मॉडल डेटा का प्रतिनिधित्व करना चाहिए के बारे में सोचना होगा

10

मुझे नहीं है अगर इसकी एक अच्छा अभ्यास, लेकिन मैं अपने खोज "डेटा के लिए उपयोग पता है "fetch" विधि में विकल्प।

https://stackoverflow.com/a/6659501/1067061

शायद यह मदद करता है। शुभकामनाएँ!

संपादित

यह अपने संग्रह यूआरएल क्वेरी पैरामीटर को पारित करने के लिए सही तरीका है, The reference to the Docs से पता चलता पारित करने के लिए कैसे डेटा में गुण लाने विकल्प, डेटा विशेषता वास्तव में महत्वपूर्ण मूल्य जोड़े चर्चा करते हुए के साथ एक वस्तु है पैराम और उनके मूल्यों को पूछने के लिए

+3

यह वास्तव में सही जवाब है। –

0

मैं विकल्प 1 की तरह संग्रह का उपयोग करने की अनुशंसा करता हूं, लेकिन केवल खोज के लिए एक नया संग्रह परिभाषित करने की आवश्यकता के बिना।

यह यहाँ के बारे में मेरे ब्लॉग पोस्ट पर एक नज़र डालें: http://willdemaine.ghost.io/restful-search-with-backbone/

var SearchableCollection = Backbone.Collection.extend({},{ 

    search: function(query, options){ 
    var search = $.Deferred(); 
    options = options || {}; 
    var collection = new this([], options); 
    collection.url = _.result(collection, 'url') + 'search?q=' + query; 
    var fetch = collection.fetch(); 
    fetch.done(_.bind(function(){ 
     Backbone.Events.trigger('search:done'); 
     search.resolveWith(this, [collection]); 
    }, this)); 
    fetch.fail(function(){ 
     Backbone.Events.trigger('search:fail'); 
     search.reject(); 
    }); 
    return search.promise(); 
    } 

}); 

तो फिर तुम कर सकते हैं:

var Cars = SearchableCollection.extend({}); 

var findCars = Cars.search('volvo'); 
findCars.done(function(cars){ 
    var carsView = new CarsView({ 
    collection: cars 
    }); 
    carsView.render(); 
}); 
संबंधित मुद्दे