2012-03-10 2 views
0

내 웹 응용 프로그램에서 기본 검색을 만들려고합니다. 다음은 검색 기능 코드입니다.레일 기본 ​​검색 및 PostgreSQL

def self.search(title, category_id, city_id) 
    if title || category_id || city_id 
     joins(:category).where('title LIKE (?) AND category.category_id IN (?) AND city.city_id IN (?)', "%#{title}%", "%#{category_id}%", "%#{city_id}%") 
    else 
     scoped 
    end 
    end 

는 내 모델에서 이러한 연관성이 있습니다

has_one :category 
    has_one :city 

을 그리고이 오류가 나는 PostgreSQL을 사용하고

ActionView::Template::Error (PG::Error: ERROR: missing FROM-clause entry for ta 
ble "category" 
LINE 1: ..._id" = "events"."id" WHERE (title LIKE ('%%') AND category.c... 

를 얻을. 이 오류를 제거하려면 어떻게해야합니까?

답변

7

사용중인 joins의 형식에서 연결 이름이 필요하며 SQL은 테이블 이름을 원합니다. 표는 categories이어야합니다.

다른 몇 가지 :.

  1. 나는 당신의 다음 오류가 도시 "이 솔루션은 .joins(:city) 및 사용에있을 것이다"테이블 항목이 FROM 절 누락 "입니다, 그래서 당신은 어디 :city에 합류 표시되지 않습니다 where에서 cities.하지만하기는 카테고리 및 도시에 대한 표현식에서 사용하고 있습니다. 단지 title LIKE ? 괜찮
  2. 당신은 LIKE 값 주위에 괄호가 필요하지 않습니다. 어쨌든 읽기
  3. 을 유지하지만 당신은주는거야 패턴이 좋고 작동하지 않습니다 : ID w 나쁘다는 숫자이고 LIKE와 함께 숫자를 사용할 수 있습니다. IN을 사용하는 경우 일반적으로 가능한 값의 목록을 제공하려는 경우 한 값과 일치 시키려면 =을 사용하고 자리 표시 자에 대해 하나의 값만 사용하십시오.
  4. cities 테이블과 city_id 열의 경우와 마찬가지로 categories 테이블에는 category_id 열이 없을 수 있습니다. 이 두 열은 모델 테이블에 있어야합니다.
  5. 제목이 없으면 제목을 검색하는 것이 타당하지 않습니다. 국가 및 도시와 유사합니다. 많은 문제처럼 보이지만 그들은 너무 많은 노력없이 고정 할 수 있습니다

:

def self.search(title, category_id, city_id) 
    rel = scoped 
    rel = rel.where('title like ?', "%#{title}%") if(title) 
    rel = rel.where('category_id = ?', category_id) if(category_id) 
    rel = rel.where('city_id  = ?', city_id)  if(city_id) 
    rel 
end 

하고도 전혀 joins 또는 명시 적 테이블 이름이 필요하지 않습니다.

+1

+100 평소와 같이 mu는 멋진 설명과 훌륭한 설명을 제공합니다. 점액 시간! –

+0

@MichaelDurrant : 고마워요.하지만 '캐스팅'에 대한 목소리가 없습니다. –

+0

대단히 고마워! – kelheor