2013-02-15 3 views
0

Я не знаю, какую функцию следует вызывать .... поэтому я могу просто описать базовый сценарий: тема has_many tags через: tagging tag has_many themes через: меченияПоказать темы принадлежат к тегам одной темы в Rails

так, в @topic шоу странице, я хочу, чтобы отобразить все темы, которые имеют теги, которые принадлежат @topic (Не с теми же метками, только один общий тег)

Один из возможных подходов is

tags.each do |tag| 
    tag.topics.each do |topic| 
    topic 
    end 
end 

bu t это приведет к дублированию в теме, так как тема может принадлежать к разным тегам

Я нахожу, что можно использовать ids.uniq для удаления дуликатов в массиве. Так это было бы решением? И как я могу получить topic_ids? Может быть topic_ids= topic_ids + topic.id?

+0

у вас уже есть 'topic_ids', используйте' @ tag.topic_ids' получить идентификаторы темы принадлежат к тегу. – Thanh

ответ

2

Это даст вам все темы, у которых tag_id соответствует тем, которые связаны с @topic. Обратите внимание, что это также будет включать в себя оригинальный @topic:

topics = Topic.joins(:taggings). 
       where(:taggings => {:tag_id => @topic.taggings.pluck(:tag_id) }). 
       uniq 

Если вы хотите исключить оригинал, просто добавьте дополнительный where в цепи:

where("taggings.topic_id != ?", @topic.id) 

Существует несколько более эффективный способ сделать это использование подзапроса вместо начального вызова базы данных для получения ассоциированного tag_id с, но этого, вероятно, будет достаточно.

+0

Это действительно круто ..... – cqcn1991

0

Я предпочитаю acts_as_taggable_on то я использую

<%= raw @topic.find_related_tags.map { |t| link_to(t.title, topic_path(t)}.join(" ") %> 
+0

Как это получить список связанных тем из оригинальной темы? – PinnyM

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