2014-09-20 2 views
0

브리징에 문제가있는 레일즈 앱에 한 쌍의 모델이 있습니다. 다른 테이블에서 값을 비교할 쿼리?

내가 함께 일하고 있어요 테이블은 다음과 같습니다

상태

+----+--------+ 
| id | place | 
+----+--------+ 
| 1 | Fl  | 
| 2 | Calif. | 
| 3 | Texas | 
| … | … | 
+----+--------+ 

모든 장소가 국가 모델에서 표현되는 것은 아닙니다

+----+--------+------------+ 
| id | fips | name | 
+----+--------+------------+ 
| 1 | 06  | California | 
| 2 | 36  | New York | 
| 3 | 48  | Texas  | 
| 4 | 12  | Florida | 
| 5 | 17  | Illinois | 
| … | …  | …  | 
+----+--------+------------+ 

장소,하지만 난에 노력하고있어 장소의 place 값을 모든 상태 name에 대해 비교할 수있는 검색어를 수행하고 가장 일치하는 항목을 찾아 해당를 반환합니다. 10. 내 입력 Calif. 경우

그래서, 난 내 출력 내가 SQL 쿼리를 작성 여전히 아주 새로운, 그래서 06

되고 싶어 내 레일 이내에 사용하여 루비를 할 수있는 방법 (4.1.5가 있다면) app, 이상적입니다.

내 다른 공격 계획은 "places"테이블에 fips 열을 추가하고 위의 비교를 실행하고 fips을 채울 수있는 내용을 작성하여 내 앱이이 페이지를로드 할 때마다이 쿼리를 실행할 필요가 없도록하는 것이 었습니다 . 그러나 나는 초심자이기 때문에 야심적 인 것처럼 들린다.

+1

'places.place' 필드에 약어가있는 이유가 있습니까? –

+0

SQL을 고려하기 전에, 일반적으로'places '의'place'에서'states'의'name'까지 어떤 종류의 일치 스키마가 당신을 얻을 수 있는지 결정할 필요가 있습니다. – lurker

+0

* most * 부분에 대해서는'places.place' ='Florida State'와'states.name' ='Florida'와 같이 보일 것입니다. 항상 그런 것은 아니지만 충분한 경우에, 그것은 대회가 될 것입니다. –

답변

2

이것은 SQL에서 쉬운 쿼리가 아닙니다. 가장 좋은 방법은 문서화 된 here 인 퍼징 문자열 일치 루틴 중 하나입니다.

예를 들어, soundex() 또는 levenshtein()으로 충분할 수 있습니다. 다음은 그 예입니다 :

select distinct on (p.place) p.place, s.name, s.fips, levenshtein(p.place, s.name) as dist 
from places p cross join 
    states s 
order by p.place, dist asc; 
관련 문제