Как вы знаете, Events.tagged_with("my_tag")
возвращает список событий, соответствующих вашим тегам.
Затем вы можете использовать оператор карты или сбора в этом списке, чтобы получить список дат для каждого события.
`map{|e| e.dates}`
Возвращает список массивов дат, где каждый массив - список дат, связанных с событием в этом индексе списка, возвращаемого Events.tagged_with("my_tag")
Для заказа по дате нужно выровнять и отсортировать.
flatten.sort{|a,b| a.created_at <=> b.created_at}
Выполнение всего вызова метода:
Events.tagged_with("my_tag").map{|e| e.dates}.flatten.sort{|a,b| a.created_at <=> b.created_at}
Вы можете упростить это с помощью именованной области на датах. Это будет более быстрый запрос, но я не могу написать его для вас, не зная больше о структуре вашей базы данных.
Это будет выглядеть примерно так, если предположить, что даты принадлежат событию:
class Date < ActiveRecord::Base
...
named_scope :for_tag, lambda do |tag|
{:joins => [:tags, :taggings],
:conditions => ["tags.name = ? AND tags.id = taggings.tag_id \
AND taggings.taggable_id = dates.event_id AND \
taggings.taggable_type = event", tag],
:order => 'dates.created_at'}
end
end
Затем вы можете сделать Date.for_tag("my_tag")
и получить тот же список в гораздо более эффективном запросе SQL.