使用复选框将搜索限制为所属对象

时间:2012-09-09 20:26:57

标签: ruby-on-rails ruby-on-rails-3 activerecord

我正在使用rails 3.2应用程序,它基本上充当带标签的博客。

标签与has_many中的帖子相关:通过关联。 (帖子通过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

2 个答案:

答案 0 :(得分:0)

是的,JOIN是你的朋友:

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

选中此rails guide作为参考。

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

答案 1 :(得分: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. 现在它生成更有效的查询(它与一个表而不是两个表连接)。