如何在Rails 4 ActiveRecord命名范围中使用OR

时间:2014-09-20 10:40:54

标签: sql ruby-on-rails

我的项目中有coursecategory个模型。 Course有很多categoriescategory有很多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])

如何重写我的范围来实现这一目标,还是有其他方法可以尝试?

2 个答案:

答案 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 })
}