2011-07-18 7 views
0

현재 데이터베이스 구조는 많은 태그로 구성된 작업 공간을 가지고 있습니다. 사용자가 검색 창에 입력하는 모든 태그가 포함 된 장소를 검색 할 수 있기를 원합니다. 나의 현재 코드는 다음과 같습니다, 그리고 그것은 단지 지정된 태그이어야 하나가 장소를 찾을 수 있습니다 :배열의 모든 요소를 ​​포함하는 항목을 찾는 중

tags = params[:tags] 

Place.find(:all, :include => [:tags], :conditions => ['tags.title IN (?)', tags]) 
+0

필요한 관계 연산자는 [모든 부분을 제공하는 공급 업체]로 널리 알려져있는 [division] (http://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29)입니다. ] (http://www.dbdebunk.com/page/page/772076.htm). 비즈니스 분석가 또는 도메인 전문가에게 [정확한 부분 또는 나머지를 포함하는 부분]을보아야하는지 문의하십시오 (http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the- sql-of-relational-division /)과 빈 divisior를 처리하는 방법 (예 : 모든 공급 업체가 제공하고 빈 부품 목록을 제공합니까?) – onedaywhen

+0

관계 구분 (http://luhong.wordpress.com/2006/03/05/relational-division-in-sql/)을 찾는 것 같아 보입니다. 이것은 아마도 추악하고 대부분 읽을 수없는 코드로 변할 것입니다. 그렇지 않으면 이름이 지정된 범위 (또는 rails3에있는 경우 범위)를 정의하고 태그를 반복하고 모든 태그와 일치하지 않는 부분을 필터링 할 수 있습니다. 그러나 ActiveRecord가 실제로 SQL 쿼리를 여러 번 실행하게 할 수 있습니다. ActiveRecord는 사이트를 느리게 만들 수 있기 때문에 원하는 것이 아닐 수 있습니다. – Frost

답변

1

이 시도 :

tags = params[:tags] 

Place.find(:all, :include => [:tags], :conditions => ['places.id IN 
    (SELECT place_id FROM 
    (SELECT place_id, count(place_id) AS tags_count FROM places_tags WHERE tag_id IN 
     (SELECT id FROM tags WHERE title IN (?)) 
    GROUP BY place_id) AS count_table 
    WHERE tags_count = ?)', tags, tags.size]) 

설명 : 먼저 배열의 모든 태그를 찾은 다음 계산을 각 장소가 몇 번이나 발견되는지 (얼마나 많은 태그가 일치하는지), 모든 태그가 일치하는 장소 만 찾습니다.

+0

복사/붙여 넣기 및이 즉시, 아주 좋은 근무! – Cesar

0

태그와 Ruby on Rails를 사용하는 경우 나는 acts_as_taggable_on을 강력히 권장합니다.

이이 같은 일을 할 수있게된다 :

class User < ActiveRecord::Base 
    # Alias for <tt>acts_as_taggable_on :tags</tt>: 
    acts_as_taggable 
    acts_as_taggable_on :skills, :interests 
end 

@user = User.new(:name => "Bobby") 
@user.tag_list = "awesome, slick, hefty"  # this should be familiar 
@user.skill_list = "joking, clowning, boxing" # but you can do it for any context! 
@user.skill_list        # => ["joking","clowning","boxing"] as TagList 
@user.save 

@user.tags # => [<Tag name:"awesome">,<Tag name:"slick">,<Tag name:"hefty">] 
@user.skills # => [<Tag name:"joking">,<Tag name:"clowning">,<Tag name:"boxing">] 

@frankie = User.create(:name => "Frankie", :skill_list => "joking, flying, eating") 
User.skill_counts # => [<Tag name="joking" count=2>,<Tag name="clowning" count=1>...] 
@frankie.skill_counts 

아주 쉽게

구현할. 그리고 배열에서 특정 요소를 찾는 방법에 대해 걱정할 필요가 없습니다.

관련 문제