2009-07-13 78 views
0

我有一個稍微複雜的查詢,我想作爲一個自然的ActiveRecord關係。目前我打電話@ calendar.events和@ calendar.shared_events,然後加入數組並對它們進行排序。整合是可以完成這個SQL:你會如何在ActiveRecord關係中表示這個sql查詢?

SELECT calendar_events.* FROM calendar_events left outer join calendar_events_calendars on calendar_events_calendars.calendar_event_id = calendar_events.id where calendar_events.calendar_id = 2 or calendar_events_calendars.calendar_id = 2 

但我不知道如何表示這是一個ActiveRecord關係。我知道我可以使用自定義的SQL查找器,但我希望能夠在結果上使用範圍。

目前事件屬於一個日曆,也通過的habtm屬於許多其他日曆連接表:

has_and_belongs_to_many :shared_events, :class_name => 'CalendarEvent', :order => 'beginning DESC, name' 
    has_many :events, :class_name => 'CalendarEvent', :dependent => :destroy, :order => 'beginning DESC, name' 

任何指針將不勝感激:)

回答

0

可以幫助我們理解您的數據結構更多一點?你試圖用兩種關係(has_many/belongs_to和HABTM)來實現,你不能通過HABTM或has_many,through來實現?在我看來,對數據模型的簡化很可能會產生您所追求的結果。 (對不起 - 沒有足夠的點或會添加評論)COMMENT

我認爲,你已經提出在您的評論是一個無限更好的解決方案

--UPDATED了。它有可能做到這一點,你已經開始實施它,但它是不必要的複雜 - 根據我的經驗,當你開始擁有瘋狂複雜和重複的關係時,你可以經常告訴你何時錯過了ActiveRecord的路徑名。

爲什麼不 一個)有它全部在一個的has_many,通過(在兩個方向) b)中的關係對連接表的附加字段來指定這是主要的/主附接(或反之亦然)。

然後,您可以在事件模型上爲共享事件等指定範圍,通過在指定的連接中包含條件來實現魔術。這給你:

@calendar.events #returns all events across the join 
@calendar.shared_events #where the 'shared' flag on the join is set 
@calendar.main_events #without the flag 
+0

這是一個很好的問題。每個事件只屬於一個日曆,但可以鏈接到其他日曆。我想我可以做一個has_many:通過並在連接表上設置某種布爾列來表明事件是否屬於這個日曆,但這看起來太過微妙。比事件絕對屬於一個日曆更好,如果有必要,也可以鏈接到其他事件。我明白爲什麼activerecord不允許這樣的關係,因爲它會增加新事件的問題。 – 2009-07-13 06:28:48