0

我正在开发一个基本上充当带有标签的博客的 rails 3.2 应用程序。

标签与 has_many :through 关联中的帖子相关。(帖子通过 taggigns 有很多标签)不知道为什么该应用程序没有 habtm 关联,因为它的工作方式相同,但这就是我所拥有的。

该应用程序现在可以显示属于这样一个标签的帖子列表:

class TagsController < ApplicationController

  def show
    @tag = Tag.find(params[:id])    
    @posts = @tag.posts.paginate(page: params[:page], :per_page => 10) 
  end
  ...
end

这样,页面 example.com/tags/1 将显示标签匹配 ID 1 的所有帖子。

我要做的是修改这个应用程序,使其具有标签复选框,并将搜索限制为例如同时具有标签 1 和 4 的帖子。

有人可以给我一个关于从哪里开始或寻找一些资源的意见吗?我想我应该使用一个连接,但我不确定情况是否如此。

谢谢你。

========

编辑:谢谢你的回答。无论如何,正如 ok32 所建议的,user1083138 的解决方案是创建重复项。同时 ok32 的结果是空数组(可能是由于我对标记系统的实施不佳)。

我提出了这个很好的解决方案:

  def self.tag_query(list)
    Post.joins(:tags).where(:tags => { :name => list } ).having("count(tags.name) = ?", list.count ).group('posts.id')
  end
4

2 回答 2

0

是的,JOIN 是你的朋友:

Post.joins(:tags).where(:tags => { :id => [tag_ids] } )

检查此导轨指南作为参考。

您还必须创建\修改视图和控制器以显示复选框并填充“tag_ids”变量。

于 2012-09-09T21:16:03.223 回答
0

JOIN 是你的朋友,但是.. 为了避免重复的结果,我建议使用类似的东西:

在控制器中:

@tags = Tag.find(params[:tag_ids])
@posts = Post.tagged_with(@tags)

Post模型中:

def self.tagged_with(tags)
  post_ids = select('posts.id').joins(:tags).where('tags.id in (?)', tags)
  where(id: post_ids)
end

更新:

我稍微修改了模型方法:

def self.tagged_with(tags)
  post_ids = joins(:taggings).where('taggings.tag_id in (?)', tags)
  where(id: post_ids)
end

发生了什么变化:

  1. 我删除了不必要select('posts.id')的 . 没有它它工作得很好。

  2. Now it generates more efficient query (it joins with one table instead of two).

于 2012-09-09T21:58:11.910 回答