2009-07-13 6 views
0

Ich habe eine etwas komplizierte Abfrage, die ich als natürliche ActiveRecord-Beziehung haben möchte. Derzeit rufe ich @ calendar.events und @ calendar.shared_events auf, schließe dann die Arrays an und sortiere sie. Die Konsolidierung in der Lage, mit dieser SQL zu tun:Wie würden Sie diese SQL-Abfrage in einer ActiveRecord-Beziehung darstellen?

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 

aber ich bin nicht sicher, wie dies als Active Beziehung zu vertreten. Ich weiß, ich könnte einen benutzerdefinierten SQL-Finder verwenden, aber ich möchte in der Lage sein, Bereiche für die Ergebnisse zu verwenden.

Derzeit gehört ein Ereignis zu einem Kalender und gehört auch zu vielen anderen Kalendern über eine HABTM Join-Tabelle:

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' 

Alle Zeiger sehr geschätzt :)

Antwort

0

Können Sie uns Ihre Daten zu verstehen helfen würde Struktur ein bisschen mehr? Was versuchst du mit den beiden Beziehungen (dem has_many/gehört_to und dem HABTM) zu erreichen, die du nicht durch den HABTM oder einen has_many erreichen kannst: durch? Es sieht für mich so aus, als würde eine Vereinfachung Ihres Datenmodells wahrscheinlich zu den gewünschten Ergebnissen führen. (sorry - nicht genug Punkte oder würde als Kommentar hinzugefügt hat)

--UPDATED NACH KOMMENTAR

Ich denke, dass in Ihrem Kommentar vorgeschlagen, was Sie haben eine unendlich bessere Lösung ist. Es ist ist möglich, es zu tun, wie Sie begonnen haben, es zu implementieren, aber es ist unnötig komplex - und nach meiner Erfahrung können Sie oft feststellen, wenn Sie mit ActiveRecord den falschen Weg gehen, wenn Sie beginnen, verrückte komplexe und doppelte Beziehung Namen.

Warum nicht a) haben sie alle in einem has_many durch Beziehung (in beiden Richtungen) b) ein zusätzliches Feld auf dem Tisch verbinden, um anzugeben, dass dies die Haupt/primary Befestigungs ist (oder umgekehrt).

Sie können dann im Ereignismodell Bereiche mit Namen für gemeinsam genutzte Ereignisse usw. verwenden, die die Magie nutzen, indem sie die Bedingung für den angegebenen Join einfügen. Das gibt Ihnen:

@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

Das ist eine gute Frage. Jedes Ereignis gehört nur zu einem Kalender, kann jedoch mit anderen Kalendern verknüpft werden. Ich denke, ich hätte eine has_many: through durchführen und eine Art boolesche Spalte in der Join-Tabelle setzen können, um anzuzeigen, ob das Ereignis im Besitz dieses Kalenders war, aber das schien zu heikel. Besser als ein Ereignis gehört definitiv zu einem Kalender und kann dann bei Bedarf auch mit anderen verknüpft werden. Ich verstehe, warum activerecord eine solche Beziehung nicht zulassen kann, da das Hinzufügen neuer Ereignisse problematisch wäre. –

+0

Danke :) Ich habe wirklich versucht, das nicht zu tun, aber am Ende musste ich deinen Weg gehen :) Es war tatsächlich überraschend einfach! Bis auf das Zuweisen von Ereignissen zu Kalendern. Ich habe eine andere Frage für diesen Zweck erstellt. –

Verwandte Themen