2011-07-18 19 views
0

私の現在のデータベース構造は、多くのタグで構成される場所があるということです。ユーザーが検索ボックスに入力するすべてのタグを含む場所を検索できるようにしたい。私の現在のコードは次のようになり、それが唯一の指定されたタグの少なくとも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]) 

は説明:最初に数え、その後、アレイ内のすべてのタグを見つける

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クエリを実際に何度も実行することがありますが、これはサイトの速度が低下する可能性があるため、おそらくあなたが望むものではありません。 – Frost

答えて

1

はこれを試してみてくださいそれぞれの場所が何回見つかったか(これはタグの数が一致する数に等しい)、すべてのタグが一致した場所のみを選択します。

+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 

非常に簡単。また、配列内の特定の要素を見つける方法についても心配する必要はありません。

関連する問題