2014-09-20 3 views
0

У меня есть course и category модели в моем проекте. Course имеет много categories и category имеет много courses.Как использовать OR в Rails 4 ActiveRecord с именем scope

В модели 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.

После того, как я экспериментировал с консолью рельсов, я обнаружил, что мне нужно использовать ИЛИ.

например.

where('categories.name = name[0] OR categories.name = name[1]) 

Как я могу переписать свой масштаб для достижения этого или есть ли другие способы, которые я могу попробовать?

ответ

1

Попробуйте это:

array_with_names = ["Some name", "Some other name", "Some more name"] 
where('categories.name in (?)', array_with_names) 

Если вы хотите использовать OR оператор, сделать массив с именами и использовать * пейнтбольный оператор:

array_with_names = ["Some name", "Some other name", "Some more name"] 
where('categories.name = ? OR categories.name = ? OR categories.name = ?', *array_with_names) 

Но я думаю, что это бесполезно.

+0

Спасибо. Это сработало. Кроме того, для тех, кто в аналогичной ситуации, мне пришлось добавить цепочку в контроллер, '.includes (: categories)', чтобы избежать двойного подсчета. –

+1

вы должны использовать ['.references (: categories)'] (http://apidock.com/rails/ActiveRecord/QueryMethods/includes) с '.includes (: categories)' in 'Rails> = 4' –

1

Используйте синтаксис Rails для этого. ActiveRecord автоматически обнаружит, что вы используете массив и будете строить для вас правильный синтаксис SQL (использовать IN или =).

scope :search_by_category, -> (array_with_names){ 
    joins(:categories).where(categories: { name: array_with_names }) 
} 
Смежные вопросы