我正在尝试使用名为genres的过滤器搜索Item模型,该过滤器通过has_many连接。
我的问题是当我选择两种或更多类型时,它还会选择只包含一种类型的记录。
示例:有两种类型的动作和冒险。记录A具有动作类型,记录B具有两种类型。通过在我的视图中选择两个类型复选框,Rails返回的记录包括记录A和记录A。 B虽然它应该只是记录B。
这是我在控制器下的过滤器声明
/dev/null
答案 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
的情况。