0

我不知道这个功能应该叫什么......所以我只能描述基本场景:topic has_many tags through :tagging tag has_many topic through :tagging

所以,在@topic 显示页面中,我想显示所有具有属于@topic 的标签的主题(不具有相同的标签,只有一个常见的标签)

一种可能的方法是

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

但这会导致主题重复,因为一个主题可能属于不同的标签

我发现可以ids.uniq用来删除数组中的重复项。那么这会是一个解决方案吗?我怎样才能得到topic_ids?也许topic_ids= topic_ids + topic.id

4

2 回答 2

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)

使用子查询而不是初始数据库调用来获取关联的 s 有一种更有效的方法tag_id,但这可能就足够了。

于 2013-02-15T16:11:18.310 回答
0

我更喜欢acts_as_taggable_on 然后我使用

<%= raw @topic.find_related_tags.map { |t| link_to(t.title, topic_path(t)}.join(" ") %>
于 2013-02-15T16:28:44.800 回答