2014-02-17 26 views
0

我在RoR中創建數據庫支持的日曆,並且第一步是返回給定年份內的所有事件。我的活動表架構如下:使用ActiveRecord幫助程序執行OR和AND條件

id:integer description:string startdate:datetime enddate:datetime 

在英語中,我覺得這是我需要執行返回落在某一年內的所有事件的邏輯:

(當活動啓動小於年開始事件結束年開始)OR

更大(當事件開始大於年開始事件結束小於年末)OR

(當事件開始小於年末事件結束大於年開始

第一行獲取在給定的所有事件結束r,第二行獲取一年內的所有事件,最後一行獲取在一年內開始的所有事件。

這個邏輯能更高效嗎?

我讀過ActiveRecord的手工創造一個公平的一些動態的網站,但我只需要去Person.find(34)Person.where(name: 'Jimmy'),真不知道如何用ActiveRecord的輔助方法執行上述邏輯!

+0

你可以做到這一點在單個查詢中,爲什麼要使用三個查詢的組合。你是否屬於Ruby on Rails開發者的其他技術? –

+0

我沒有太多練習SQL語句。我很樂意看到如何用一個查詢來完成它:) – Starkers

回答

1

寫在你的模型範圍

class Event < ActiveRecord::Base 

    scope :event_in_year, lambda { |year| where('(events.startdate < ? AND events.enddate > ?) OR (events.startdate > ? AND events.enddate < ?) OR (events.startdate < ? AND events.enddate > ?)', year.beginning_of_year, year.beginning_of_year, year.beginning_of_year, year.end_of_year, year.end_of_year, year.beginning_of_year)} 
    end 

,然後用這個範圍內找到任何一年之間的事件,在當年通過這個範圍

+0

很酷,這回答我的問題,但你認爲查詢可以簡化嗎? – Starkers

+0

off-course是的,看看這個http://makandracards.com/makandra/984-test-if-two-date-ranges-overlap-in-ruby-or-rails –

+0

如果你覺得,我的回答是正確的,你介意接受嗎? –

0

我認爲你可以簡化爲

SELECT DISTINCT id, description FROM calendar 
WHERE enddate >= myyear AND endate <= myyear + 1 
    OR (startdate >= myyear AND startdate <= myyear + 1) 

第一WHERE子句行給出的所有結束在這一年,包括這些開始並在當年結束,第二個給所有在這一年開始。具有鮮明的你得到的結束,並於同年開始只有一次

對於確切的語法數據庫應該知道

1

ActiveRecordwhere方法,你可以通過一個string查詢來滿足您的需求。因此,像:

your_string = "events.start_date > ...." 
Model.where(your_string)