通过habtm关联查找数据



我无法理解如何实现这一目标,也无法希望有人能提供帮助——我相信这将是一件简单的事情!

我正试图在我的rails应用程序中从头开始实现一个"标签云"(与railscasts.com上发布的事件非常相似),但增加了复杂性,我只想在我的"云"中显示与返回的结果相关的标签。例如,假设在索引视图中,用户已经过滤了结果。我的愿望是只显示过滤结果集中的标记。

我有两个模型,它们之间包含HABTM关联:

class Article < ActiveRecord::Base
has_and_belongs_to_many :tags
...
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :articles
...
end

在我的文章控制器中,我有一个@particles变量,它为我提供了在索引操作中显示的结果。为了这个解释的目的,我们假设它是:

@article=article.all

我想我能做的是调用@article.tag,希望它能在结果中返回所有文章的相关标签。我想我可以对它们进行分组和迭代,在云中显示它们。然而,这会引发一个"未定义的方法错误"。

我一直在rails控制台上玩,发现如果我运行:

>> @articles = Article.find(1)
>> @articles.tags

然后所有与那篇文章相关的标签都会返回给我。你为什么不能在.all上调用它?

如果我直接使用SQL,我会做一些类似的事情:

SELECT name, COUNT(*)
FROM tags INNER JOIN articles_tags on ... INNER JOIN articles on...
WHERE // filtered results
GROUP BY name

我想这是一个简化的等价物,但我正在尝试使用rails查询语言。

有什么想法吗?

您可以通过以下方式获取包含文章的标签:

Tag.joins(:articles)

同样适用于有标签的心房。

Article.joins(:tags)

您可能更喜欢使用has_many through而不是habtm,这使您能够更好地控制联接表,请检查以下问题