【问题标题】:Use checkboxes to restrict search to belonging objects使用复选框将搜索限制为所属对象
【发布时间】:2012-09-25 22:35:19
【问题描述】:

我正在开发一个 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

【问题讨论】:

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


    【解决方案1】:

    是的,JOIN 是你的朋友:

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

    检查此rails guide 作为参考。

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

    【讨论】:

    • 我实际上发现此解决方案更清洁且更易于实施。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 酷,这可能会正常工作。当然,这将不再适合 tags#show 动作。放置它的最“古怪”的地方是什么?
    • 我用解决方案编辑了原始帖子。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多