найти всех потомков объекта, помеченного Act_as_taggable_on - PullRequest
1 голос
/ 21 октября 2009

У меня есть сайт рельсов с двумя моделями: события и даты

события имеют много дат

события помечены с помощью act_as_taggable_on

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

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

Надеюсь, это имеет смысл, спасибо за любой вклад!

1 Ответ

1 голос
/ 22 октября 2009

Как вы знаете, 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.

...