Групповые события по дням с has_many: ассоциация дат в рельсах - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть модель событий, у которой много дат.

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

 Date.all.group_by {|d| d.date.at_beginning_of_day }.each do |datestr, dates|

В идеале я бы хотел что-то подобное ...

@events = Event.find(:all, :conditions => {:published => true})
@events.group_all_dates_by_day.each do |datestr, dates|

Как бы я это сделал?

EDIT

Это то, что я хотел бы сделать, но мне не нравится код.

@events = Event.find(:all, :conditions => {:published => true})
ids = @events.map { |event| event.dates.map { |date| date.id }.join.to_i}

Date.find(ids).group_by {|date| date.date.at_beginning_of_day }

1 Ответ

1 голос
/ 13 декабря 2011

Сделайте что-то вроде этого:

@published_events = Event.select("events.*, dates.date AS date_of_event")
     .joins(:dates)                    # you join dates table to sort the events by date
     .where(:published => true)        # here you take only published events
     .order("dates.date ASC")         # here you order them  

В ваших представлениях вы сделаете что-то вроде

@published_events.each do |event|
   <p><%= event.id %></p>
   <p><%= event.name %></p>
   <p><%= event.date_of_event %></p>
end  

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

Надеюсь, это полезно!

Редактировать: Если вы хотите сгруппировать их по дате, послевы извлекаете их из базы данных (это очень важно), вы действительно можете использовать group_by ( group by находится в Enumerable / group_by ), как это

@published_events.all.group_by(&:date_of_event)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...