2010-04-21 16 views
14

में एक श्रेणी को ओवरलैप करने वाले रिकॉर्ड ढूंढना तो, मेरे पास Event मॉडल है जिसमें starts_at और ends_at कॉलम है और मैं कई तिथियों में होने वाली घटनाओं को ढूंढना चाहता हूं।रेलों

मैं इस named_scope ले कर आए हैं (range आम तौर पर एक महीने के है):

named_scope :in_range, lambda { |range| 
    {:conditions => [ 
    'starts_at BETWEEN ? AND ? OR ends_at BETWEEN ? AND ?', 
    range.first, range.last, range.first, range.last]} } 

अपेक्षा के अनुरूप कौन सा काम करता है।

लेकिन एक घटना महीने शुरू होता है, तो इससे पहले कि और रेंज वह विज्ञापन नहीं दिखाएगा के बाद महीने के समाप्त होता है। क्या उन घटनाओं को उचित तरीके से ढूंढने का कोई तरीका है?

उत्तर

21

चार मामलों रहे हैं:

 Start End 
1.  |-----| 
2. |------| 
3. |-------------| 
4.   |------| 

आपका named_scope केवल हो जाता है मामलों 1,2 और 4 तो आप बस जोड़ने की जरूरत की जरूरत है:

named_scope :in_range, lambda { |range| 
    {:conditions => [ 
    '(starts_at BETWEEN ? AND ? OR ends_at BETWEEN ? AND ?) OR (starts_at <= ? AND ends_at >= ?)', 
    range.first, range.last, range.first, range.last, range.first, range.last 
    ]} 
} 
+3

यह बढ़िया है! अच्छा आरेख भी :) – mikker

0

मुझे लगता है कि रेंज शुरू होने के बाद और समाप्त होने से पहले शुरू होने पर एक ईवेंट ओवरलैप हो जाता है। :)

तो:

{:conditions => ['? < ends_at AND ? > starts_at', range.first, range.last]} 
संबंधित मुद्दे