Rails过滤记录has_many通过

时间:2016-01-10 07:51:26

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

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

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

示例:有两种类型的动作和冒险。记录A具有动作类型,记录B具有两种类型。通过在我的视图中选择两个类型复选框,Rails返回的记录包括记录A和记录A。 B虽然它应该只是记录B。

这是我在控制器下的过滤器声明

/dev/null

1 个答案:

答案 0 :(得分:0)

它不起作用的原因在于从表达式创建的SQL。 where('genres.id' => [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的情况。