通过habtm协会查找数据

时间:2014-10-29 23:28:55

标签: ruby-on-rails activerecord

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

我正试图实施一个"标签云"在我的rails应用程序中从头开始(与railscasts.com上发布的情节非常相似),增加了复杂性,我只想在我的" cloud"中显示标签,这些标签与返回的结果有关。例如,让我们说在索引视图中,用户已经过滤了结果。我的愿望是只显示过滤结果集中的标签。

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

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

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

在我的文章控制器中,我有一个@articles变量,它给出了我在索引操作中显示的结果。出于解释的目的,让我们说出来:

@article = Article.all

我认为我能做的就是调用@ article.tags,希望它能在结果中返回所有文章的关联标签。我以为我能够对它们进行分组和迭代,并在云中显示它们。但是,这会引发&#34;未定义的方法错误&#34;。

我一直在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-query-lingo。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

Tag.joins(:articles)

同样适用于带有标签的atricles。

Article.joins(:tags)

您可能更喜欢使用has_many而不是habtm,这样可以更好地控制联接表,请检查this question