2014-07-23 5 views
1

을 통해 내가 세 가지 모델 객체, Team, UsersMember와 응용 프로그램을 만들고 있어요으로 생각 - 스핑크스 검색, Member는이 TeamUsers 사이에 테이블을 조인. 따라서 각 Team에는 많은 회원이있을 수 있으며 각 User은 여러 팀의 회원이 될 수 있습니다.4.1 레일 - 대다 관계

의 관계는 다음과 같습니다 : 내가하고 싶은 것은 특정 팀에있는 회원을 검색하는 것입니다

# Team.rb 
has_many :members 
has_many :users, through: :members 

# User.rb 
has_many :members 
has_many :teams, through: :members 

. 현재 no 개의 결과가 표시됩니다.

내 인덱스는 다음과 같습니다

# user_index 
ThinkingSphinx::Index.define :user, :with => :real_time do 
    indexes name 
    indexes email 
    indexes about 

    has team_id, type: :integer 
    has created_at, type: :timestamp 
    has updated_at, type: :timestamp 

    indexes members.team.name, :as => :teams 
end 

# team_index 
ThinkingSphinx::Index.define :team, :with => :real_time do 
    indexes name 

    has created_at, type: :timestamp 
    has updated_at, type: :timestamp 

    indexes members.user.name, :as => :members 

end 

# member_index.rb 
ThinkingSphinx::Index.define :member, :with => :real_time do 

    has user_id, type: :integer 
    has team_id, type: :integer 
    has created_at, type: :timestamp 
    has updated_at, type: :timestamp 

end 

(I 검색을 수행하는 곳) 내 members_controller 인덱스 작업이 - 다음과 같습니다 : 나는 팀이 실제로 사용자를 가지고 있음을 확인했다

def index 

    @team = Team.find_by_id(params[:team_id]) 
    @users = @team.users.search(params[:search], :page => params[:page], :per_page => 10) 

end 

, @users는 항상 0을 반환합니다. 원하는대로 작동하도록 어떻게해야하는지에 대한 아이디어가 있습니까?

업데이트

나는 레일 사용 : 4.1.4 그리고 생각-sphink : 3.1.1

내 스핑크스 쿼리는 다음과 같습니다

Sphinx Query (0.7ms) SELECT * FROM `member_core` WHERE MATCH('Anders') AND `team_id` = 2 AND `sphinx_deleted` = 0 LIMIT 0, 10 

스핑크스를 찾을 수 0 결과

약간 업데이트 된 컨트롤러 코드 사용 :

@members = @team.members.search(params[:search], :page => params[:page], :per_page => 10) 
+0

레일스 로그를보고 해당 SphinxQL 쿼리를 확인할 수 있습니까? – pat

+0

또한 어떤 버전의 Rails와 Thinking Sphinx를 사용하고 있습니까? – pat

+0

@pat 내 질문을 업데이트했으며 질문에 대한 답변을 얻었습니다. – Anders

답변

1

그래서이 문제의 원래 원인은 검색 쿼리가 제공되었지만 일치 할 필드가 없었기 때문입니다. 필드를 추가하면 큰 효과가 있습니다.

위의 설명에서 언급 한 두 번째 문제는 전자 메일 주소를 검색 할 때 쿼리 오류가 발생한다는 것입니다. 이는 @ 문자가 검색어의 필드 이름을 나타 내기 때문입니다 (예 : "@name Anders"과 같은 특정 필드로 검색을 제한하여 name이라는 필드 내에서 Anders를 검색).

두 가지 방법이 있습니다 ... ThinkingSphinx::Query.escape(params[:query])에 검색어를 래핑하여 이스케이프하거나 특정 이메일 주소를 검색하는 경우 대신 ActiveRecord를 사용하는 것이 좋습니다 (거의 확실합니다). 데이터베이스의 전자 메일 주소에 대해 고유 한 제한 조건을 가지므로 일치하는 레코드가 하나 또는 하나만 있어야합니다. 후자의 접근 방식은 이메일을 색인 필드로 가질 필요가 없다는 것을 의미합니다. 매개 변수를 통해 누구나 검색어를 정의하게하면 좀 더 안전합니다. 누군가가 'gmail'을 검색하게하고 Gmail 주소로 모든 사용자를 되돌려 놓는 것은 현명한 생각이 아닙니다.

+0

감사합니다. 사용한다면'ThinkingSphinx :: Query.escape (params [: query]) '를 어디에 두어야합니까? 이것을 컨트롤러에 추가하면 : @members = Member.search ThinkingSphinx :: Query.escape (params [: search]), : => {: team_id => @ team.id}'와 함께하면 다음과 같이됩니다. 오류 :'nil : NilClass에 대한 정의되지 않은 메소드'gsub '. – Anders

+0

검색 매개 변수가 있는지 확인하기 위해 if 문을 추가하여 위의 주석을 해결했습니다. 감사합니다. @pat! – Anders