2011-02-14 2 views
3

다음 구성을 사용하여 관련 모델에 인덱스를 정의하는 올바른 방법은 무엇입니까?Thinking Sphinx에서 관련 모델에 대한 인덱스 정의

나는 latlng 속성과 관련된 모델 Profile 나는 그래서 그것을 지리적 검색을 수행 할 수있는 사용자 모델에 대한 인덱스를 정의 할 필요가 User

class User < ActiveRecord::Base 
    has_one :user_profile 

    define_index do 
    # This doesn't work :(
    has "RADIANS(user_profiles.localities.lat)", :as => :lat, :type => :float 
    has "RADIANS(user_profiles.localities.lng)", :as => :lng, :type => :float 
    end 
end 

end 

class UserProfile < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :locality 
end 

class Locality < ActiveRecord::Base 
    has_many :user_profiles 
end 

와 모델 Locality 있습니다.

답변 해 주셔서 감사합니다.

답변

10

문제는 두 가지이다 :

  • 스핑크스 당신이 user_profile로 및 지역 단체에 가입 할 것을 알고하지 않습니다 생각.
  • SQL 스 니펫은 표준 SQL이어야하므로 관련을 연결할 수 없습니다.

다음은 트릭을해야 다음은 SQL 내에서 단일 참조를 사용

define_index do 
    # force the join on the associations 
    join user_profile.locality 

    # normal SQL: 
    has "RADIANS(localities.lat)", :as => :lat, :type => :float 
    has "RADIANS(localities.lng)", :as => :lng, :type => :float 
end 

클라우디오의 포인트는 정확하지 않습니다 - SQL 내에서, 당신은 테이블 이름을합니다. 하지만 조인 호출에서 올바른 연결 참조가 필요합니다 (따라서 그들은 단 하나의 연결입니다).

건배

+0

위대한, 내가 만들었던 혼란에 대 한 미안 해요 : –

+0

이것은 문제를 해결합니다. 명확하게 해줘서 고마워. –

1

정말 정확한 해결책을 알고 있지만하지 마십시오

당신은 오타가 :

has_one :user_profile 

define_index do 
    # This doesn't work :(
    has "RADIANS(user_profiles.localities.lat)", :as => :lat, :type => :float 

당신은 속성에 대해 "user_profiles"를 사용을, 그것은 복수하지 않아야로 변경합니다 : "유저 프로필".

반복합니다.이 사례에 대한 연결을 탐색 할 수 있는지 여부는 잘 모르겠지만 가능하다면 오타가되어야합니다.

당신은 자세한 내용을 보려면 여기를 읽을 수 있습니다 http://freelancing-god.github.com/ts/en/geosearching.html

+0

테이블 이름을 참조하려고했습니다. Pat의 답변으로 문제가 해결되었습니다. 어쨌든 감사드립니다! –