Ruby on rails Rails筛选器记录已通过多次

Ruby on rails Rails筛选器记录已通过多次,ruby-on-rails,ruby-on-rails-3,activerecord,has-many-through,Ruby On Rails,Ruby On Rails 3,Activerecord,Has Many Through,我正在尝试搜索一个项目模型,其中包含一个名为genres的过滤器,该过滤器通过has\u many连接 我的问题是,当我选择两种或更多类型时,它也会选择只包含一种类型的记录 有两种类型的动作和冒险。记录A有动作类型,记录B有两种类型。通过在我的视图中选择这两个类型复选框,Rails返回的记录包括记录A和记录B,而它应该只包含记录B 这是控制器下的筛选语句 //This is under controller @item = Item.includes(:genres).where('ge

我正在尝试搜索一个项目模型,其中包含一个名为genres的过滤器,该过滤器通过has\u many连接

我的问题是,当我选择两种或更多类型时,它也会选择只包含一种类型的记录

有两种类型的动作和冒险。记录A有动作类型,记录B有两种类型。通过在我的视图中选择这两个类型复选框,Rails返回的记录包括记录A和记录B,而它应该只包含记录B

这是控制器下的筛选语句

  //This is under controller
  @item = Item.includes(:genres).where('genres.id' => params['genre_ids'])
  // This is under my view
  <%= simple_form_for Item.new, :method => :get, url: search_path do |f| %>

        <% Genre.all.each do |sc| %>
            <div>
                <label>
              <%= check_box_tag 'genre_ids[]',sc.id %>
                <span style="font-weight:normal;"><%= sc.name %> </span>
             </label>
            </div>
          <% end %>

    <% end %>
//这在控制器下
@item=item.includes(:genres)。其中('genres.id'=>params['genre\u id']))
//这是我的看法
:get,url:search|u path do | f |%>

它不起作用的原因是从表达式中创建的SQL<代码>其中('genres.id'=>[1,2,3])为您提供
选择。。。其中(1,2,3)
中的genres.id本质上是或表达式

要解决这个问题,您需要在Ruby或SQL中过滤所选类型的数量。我会用SQL这样做:

genre_ids = params['genre_ids']
items = Item.joins(:genres).where('genres.id' => genre_ids).group('items.id').having("count(*) = #{genre_ids.size}")

使用此选项,您将选择具有确切给定类型集的项目。请记住在参数中使用空的
genre\u id
来处理此情况。

我现在无法测试代码,但为了将来参考SQL,(我使用的是PostgresSQL),我在哪里可以阅读到常用于筛选记录的常用表达式?您所说的“常用表达式”是什么意思?这只是一个逻辑问题——因为结果是每个流派(是的,每个流派,而不是每个项目)都有一个记录,所以您可以按项目ID对它们进行分组,然后删除记录数小于您提供的流派ID数的记录。通过这种方式,您只需获得一组确切类型的唱片。