2015-09-21 7 views
7

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

मैंने एक बहुत ही बेवकूफ दृष्टिकोण लागू किया है जहां मैं कब्जे वाले दिनों को दिनों की एक श्रृंखला के रूप में संग्रहीत करता हूं।

attribute :occupied_at_i do 
    array = [] 
    if !occupied_at.empty? 
     occupied_at.each do |date| 
      array << Time.parse(date).to_i 
     end 
    end 
    array 
end 

और फिर ग्राहक के पक्ष में, मैं जोड़ने के लिए निम्नलिखित जावास्क्रिप्ट कोड पार की जाँच करता है, तो दिन numericRefinement

// Date Filters 
$('.date-field') 
    .on('change', function() { 
     if(_.every(_.map($('.date-field'), function(date) {return _.isEmpty(date.value) }), function(n) {return n==false;})) { 
      helper.clearRefinements('occupied_at_i'); 
      var arrayOfDates = addDateFilters(); 
      _.forEach(arrayOfDates, function(n) { 
       helper.addNumericRefinement('occupied_at_i', '!=', n); 
      }); 
      showClearAllFilters(); 
      helper.search(); 
     } 
    }); 

तो में है, यह स्पष्ट रूप से यह करने के लिए एक अच्छा तरीका नहीं है , मैं सोच रहा हूं कि अल्गोलिया पर लाभ उठाने और अवधि के आधार पर खोज करने के लिए बेहतर क्या है?

धन्यवाद

+5

मुझे वास्तव में विश्वास है कि यह आपकी समस्या से निपटने का एक अच्छा तरीका है। उपलब्धता खोज हमेशा संभालना मुश्किल है। इस समाधान में आपको क्या परेशान कर रहा है? – Jerska

उत्तर

0

आशा इस दूसरों में मदद करता है (के बाद से सवाल बहुत पहले कहा है)

यह हमेशा बेहतर है सर्वर साइड पर छानने करते हैं और परिणाम प्रस्तुत करना। यहां एक दृष्टिकोण datetime फ़ील्ड को start_date और end_date के रूप में कक्ष मॉडल में जोड़ना होगा। इसलिए जब उपयोगकर्ता इनपुट दिनांक और समाप्ति तिथि प्रारंभ करते हैं, तो रिकॉर्ड उस अवधि में कब्जे वाले स्थिति के आधार पर प्राप्त किए जाते हैं। एक साधारण पूछताछ हो की तरह होगा: अन्य सबसे अच्छा समाधान

Room.where.not("start_date >= ? AND end_date <= ?", start_date, end_date) 

आरंभ और समाप्ति दिनांक क्षेत्रों के साथ कमरे में बुकिंग विवरण को बचाने के लिए एक और मॉडल के लिए की तरह होगा। इस तरह हम एक विशेष कमरे के लिए कई कमरे बुकिंग कर सकते हैं और इसे कमरे बुकिंग संग्रह में एक साथ सहेजा जा सकता है। इसलिए क्वेरी बन जाएगी:

Room.left_joins(:room_bookings). 
    where(
    "room_bookings.start_date > ? OR 
    room_bookings.end_date < ?", end_date, start_date 
)