#ruby-on-rails #ruby #group-by
#рубин на рельсах #рубин #группа-по
Вопрос:
Организация-это столбец участника, вложенный в инструкцию this includes. Я хочу, чтобы он группировался attendee.org в алфавитном порядке
@meetings = NwMeeting.includes(meeting_attendees: [:attendee]).where(show_id: @show.id) @meetings.each do |meeting| @nw_attendee_meetings = meetingamp;.meeting_attendees(amp;:attendee) @nw_attendee_meetings.each do |nw_attendee_meeting| attendee = nw_attendee_meetingamp;.attendee data = [] data lt;lt; attendeeamp;.org data lt;lt; attendeeamp;.name data lt;lt; meetingamp;.statusamp;.capitalize AxlsxTools.add_row(data) (edited)
Комментарии:
1. Является
org
ли это ассоциацией или атрибутом? Если атрибут, тоNwMeeting.includes(meeting_attendees: [:attendee]).where(show_id: @show.id).references(meeting_attendees: [:attendee]).order(Attendee.arel_table[:org].asc)
он будет работать, если вам нужно будет присоединиться к ассоциации. Также, возможно, вы захотите упомянуть, как вы хотите обрабатывать пустые организации. Обратите внимание, что слишком много операторов безопасной навигации.2. Вы хотите, чтобы встречи с НУЛЕВОЙ организацией помещались перед всеми записями или после них?
3. @kevinluo201 впереди!
Ответ №1:
Поскольку вы хотите перечислить записи участников, может быть немного проще, если вы переключите «основную» модель, которую вы запрашиваете, на Участника. Присоединяйтесь к NwMeeting и ВЫБЕРИТЕ status
столбец, затем вы можете просто сделать ORDER BY attendees.org ASC
, записи с нулевым значением по умолчанию будут помещены перед другими.
@attendees = Attendee.joins(meeting_attendees: :nw_meeting) .select("attendees.*, nw_meetings.status AS meeting_status") .where(nw_meetings: { show_id: @show.id }) .order("attendees.org ASC") # .order("attendees.org ASC NULL FIRST") if you use PosgreSQL @attendees.each do |attendee| data = [] data lt;lt; attendee.org data lt;lt; attendee.name data lt;lt; attendee.meeting_statusamp;.capitalize AxlsxTools.add_row(data) end
кстати, метод Arel @engineersmnky более продвинутый, и это тоже должно сработать 🙂