В SQL вы можете выполнять поиск по нескольким условиям. Вы определили две области, и они могут быть объединены в цепочку следующим образом:
Project.search_by_name('fooproject').search_by_client('misterx')
Это создает следующий SQL:
SELECT "projects".* FROM "projects" WHERE "projects".name LIKE '%fooproject%' AND "projects".client_id LIKE '%misterx'
Оператором, объединяющим эти два условия, является «И», что означает, что результатом будут те, которые удовлетворяют обоим условиям, а не любому условию.
Есть несколько способов получить проекты с определенным именем или проекты, принадлежащие клиенту. Самый простой способ - создать новую область видимости, в которой указан оператор OR:
scope :search_by_name_or_client, lambda { |name, client| where('name LIKE ? OR client_id LIKE ?', "%#{name}%", "%#{client}%") }
Возможно, вы также захотите взглянуть на SQL UNION, которые объединяют результирующий набор из двух или более операторов выбора. ActiveRecord не обрабатывает функциональность UNION, но существуют гемы для расширения функциональности, включающие это, такие как https://github.com/tsmango/union
И пример написания этого с использованием самоцвета Союза будет выглядеть так:
Project.union([{:conditions => ['name like ?', "%#{name}%"]}, {:conditions => ['client like ?', "%#{client}%"]}])
Это приведет к созданию следующего SQL:
SELECT "projects".* FROM "projects" WHERE "projects".name LIKE '%fooproject%'
UNION
SELECT "projects".* FROM "projects" WHERE "projects".client_id LIKE '%misterx'
Более подробную информацию о SQL UNION можно найти здесь: http://www.w3schools.com/sql/sql_union.asp