【问题标题】:Rails filter records has_many throughRails 过滤记录 has_man 通过
【发布时间】:2016-01-10 07:51:25
【问题描述】:

我正在尝试使用名为 Genes 的过滤器搜索 Item 模型,该过滤器由 has_many through 连接。

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

示例:有两种类型,名为动作和冒险。记录 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 %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord has-many-through


    【解决方案1】:

    它不起作用的原因在于从您的表达式创建的 SQL。 where('genres.id' =&gt; [1, 2, 3]) 为您提供SELECT ... WHERE genres.id IN (1,2,3),它本质上是 OR 表达式。

    要解决此问题,您需要在 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_ids为空的情况。

    【讨论】:

    • 我现在无法测试代码,但为了将来参考 SQL,(我正在使用 PostgresSQL)我在哪里可以阅读那些常用来过滤记录的常用表达式?
    • 你所说的“常用表达”是什么意思?这只是涉及到一些逻辑——因为你得到了每个流派的记录(是的,每个流派,而不是项目),你可以按项目 ID 对它们进行分组,然后删除那些记录数少于流派 ID 数的记录你提供的。这样您就可以只获得具有确切类型集的记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2023-03-07
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多