Как бы вы представили этот SQL-запрос в отношениях ActiveRecord? - PullRequest
0 голосов
/ 13 июля 2009

У меня есть немного сложный запрос, который я хотел бы иметь в качестве естественного отношения ActiveRecord. В настоящее время я вызываю @ calendar.events и @ calendar.shared_events, затем присоединяюсь к массивам и сортирую их. Консолидация может быть выполнена с помощью этого 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 finder, но я хотел бы иметь возможность использовать области для результатов.

В настоящее время событие относится к одному календарю, а также ко многим другим календарям через таблицу соединений 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'

Любые указатели будут с благодарностью:)

1 Ответ

0 голосов
/ 13 июля 2009

Можете ли вы помочь нам понять вашу структуру данных немного больше? Чего вы пытаетесь достичь с помощью двух отношений (has_many / own_to и HABTM), которых вы не можете достичь с помощью HABTM или has_many,: through? Мне кажется, что упрощение вашей модели данных, вероятно, даст результаты, к которым вы стремитесь. (извините - недостаточно очков или добавили бы в качестве комментария)

- ОБНОВЛЕНО ПОСЛЕ КОММЕНТАРИИ

Я думаю, что то, что вы предложили в своем комментарии, является бесконечно лучшим решением. возможно сделать так, как вы начали его реализовывать, но это неоправданно сложно - и по моему опыту вы часто можете сказать, когда вы идете по неверному пути с ActiveRecord, когда начинаете испытывать сложные и повторяющиеся имена отношений.

Почему бы и нет а) иметь все в has_many, через отношения (в обоих направлениях) б) иметь дополнительное поле в таблице соединений, чтобы указать, что это основное / основное вложение (или наоборот).

Затем вы можете назначить именованные области в модели событий для общих событий и т. Д., Которые делают чудо, включив условие в указанное соединение. Это дает вам:

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...