2009-10-21 3 views
1

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

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

события помечаются с помощью acts_as_taggable_on

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

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

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

ответ

1

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

+0

Спасибо, первое решение работало отлично. Во-вторых, у меня возникают проблемы (возможно, потому, что вы не знаете точную структуру db, как вы сказали). Я скорректировал его в меру своих возможностей, но я получаю сообщение о том, что ассоциация «тегов» не существует. Немного посмотрев на него, похоже, что он вызван: объединяет часть кода, потому что для дат не существует привязки тегов. Есть идеи? – Ryan

+0

Я не использовал act_as_taggable_on, поэтому я предположил, что он неявно определяет отношения has_many с тегами, он должен иметь другое имя. Посмотрите на действия \ _as \ _taggable \ _on source, чтобы выяснить, к каким таблицам присоединиться. В крайнем случае я мог бы посмотреть на это, но вам нужно будет опубликовать фрагменты ваших моделей, которые определяют отношения и теги. Как и в только строках с \ _many/принадлежит \ _to/act \ _as \ _taggable/действует \ _as \ _taggable \ _on – EmFi

+0

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

Смежные вопросы