2012-02-25 2 views
3

나는 레일 아주 새로운 오전 나는이 주위에 내 머리를 얻이 수없는 것 : 나는 다양한 프로젝트 다양한 클라이언트에 속하는이Ruby on Rails 3에서 스코프를 결합하는 방법은 무엇입니까?

.

scope :search_by_name, lambda { |fn| where('name LIKE ?', "%#{fn}%") } 

scope :search_by_client, lambda { |fn| where('client_id LIKE ?', fn) } 

모두 작동하는 것 : 내 프로젝트 모델에서

나는 두 가지 검색 기능을 가지고 있습니다. URL의 예를 들어 내가이 쿼리에 전달할 수 있습니다 : 나는 동등하게이 작업을 수행 할 수 있습니다

/projects?search_by_name=fooproject 

:

/projects?search_by_client_name=misterx 

이것은 클라이언트 MisterX에 속하는 모든 프로젝트 얻을 것입니다.

이제 수있는 방법이 foofoo라는 이름의 쿼리

/projects?search=foofoo 

foofoo뿐만 아니라 클라이언트에 속하는 프로젝트라는 이름의 프로젝트를 검색 할 수 있도록이 두 가지 검색 기능을 결합 있는가?

도움 주셔서 감사합니다.

+1

무엇을 귀하의 컨트롤러는 어떻게 생겼습니까? –

+0

다음과 같이하십시오 :'@projects = current_user.projects.search_by_name (params [: name]). search_by_client (params [: client])' – Tintin81

답변

7

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' 

이 두 조건을 결합 연산자는 "AND를"이는 결과 것을 의미한다 두 가지 조건을 모두 충족시키는 것이지 조건을 충족시키지 않는 것입니다.

특정 이름을 가진 프로젝트 또는 클라이언트에 속한 프로젝트를 검색하는 데는 몇 가지 방법이 있습니다.

scope :search_by_name_or_client, lambda { |name, client| where('name LIKE ? OR client_id LIKE ?', "%#{name}%", "%#{client}%") } 

또한 두 개 이상의 SELECT 문의 결과 집합을 결합하여 SQL 조합,보고 할 수 있습니다 : 가장 간단한 방법은 OR 연산자를 지정하는 새 범위를 만드는 것입니다. 액티브는 UNION 기능을 처리하지 않지만, 다음과 같이 보일 것 같은 https://github.com/tsmango/union

그리고 연합 보석을 사용하여이를 작성하는 예 등이 포함 할 수있는 기능을 확장 할 수있는 보석이 있습니다 :

Project.union([{:conditions => ['name like ?', "%#{name}%"]}, {:conditions => ['client like ?', "%#{client}%"]}]) 

이 생성 것은 다음 SQL : SQL 조합에

SELECT "projects".* FROM "projects" WHERE "projects".name LIKE '%fooproject%' 
UNION 
SELECT "projects".* FROM "projects" WHERE "projects".client_id LIKE '%misterx' 

자세한 내용은 여기에서 찾을 수 있습니다 : http://www.w3schools.com/sql/sql_union.asp

+0

안녕 벤, 도와 줘서 고마워. 내 컨트롤러에서이 기능을 사용하는 방법을 알려주실 수 있습니까? 지금 당장은 이것을 가지고 있지만 제대로 작동하지는 않습니다 :'@projects = current_user.projects.search_by_name_or_client (params [: name], params [: client])' – Tintin81

+0

Project 클래스에서 보일 범위를 정의합니다 like : '스코프 : search_by_name_or_client, lambda {| name, client_id | "% # {name} %", "% # {client_id}") –

+0

또한 질문에서 client_name을 검색하지만 client_id 열을 확인하는 것처럼 보입니다. 어떤 필드를 검색할지 잘 모르겠습니다. client_id는 아마도 프로젝트 테이블의 열입니다. 즉, 이름으로 검색하기 위해 클라이언트에 가입 할 필요가 없습니다. 클라이언트가 연결된 데이터 인 경우 범위는 다음과 같습니다. 'scope : search_by_name_or_client, lambda {| name, client_name | "% # {name} %", "% # {client_name}") 조인 (: 클라이언트) ' –

관련 문제