我正在使用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
答案 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
发生了什么变化:
我删除了不必要的select('posts.id')
。没有它,效果很好。
现在它生成更有效的查询(它与一个表而不是两个表连接)。