我的项目中有course
和category
个模型。 Course
有很多categories
,category
有很多courses
。
在course
模型中,我有一个范围:search_by_category
,它将采用类别名称,并找到课程类别名称等于名称的课程。
scope :search_by_category, -> (name){
joins(:categories).where('categories.name = ?', name) if name.present?
}
如果我有一个名字,范围就可以正常工作。但是当我有一个名字数组时,它会中断,因为where('categories.name = ?', "Some name", "Some other name", "Some more name")
是一种无效的SQL语法。
在我尝试使用rails控制台后,我发现需要使用OR。
e.g。
where('categories.name = name[0] OR categories.name = name[1])
如何重写我的范围来实现这一目标,还是有其他方法可以尝试?
答案 0 :(得分:2)
试试这个:
array_with_names = ["Some name", "Some other name", "Some more name"]
where('categories.name in (?)', array_with_names)
如果您想使用OR
运算符,请使用名称生成数组并使用*
splat运算符:
array_with_names = ["Some name", "Some other name", "Some more name"]
where('categories.name = ? OR categories.name = ? OR categories.name = ?', *array_with_names)
但我觉得这没用。
答案 1 :(得分:1)
使用Rails语法。 ActiveRecord将自动检测您是否正在使用数组,并将为您构建正确的SQL语法(无论是使用IN
还是=
)。
scope :search_by_category, -> (array_with_names){
joins(:categories).where(categories: { name: array_with_names })
}