5

サブジェクト名が検索キーワードと一致するすべてのプロファイルを取得したいと考えています。今、すべてのプロファイルを読み込んでいます。私はそれを達成する方法を知る必要があります。どんな助けでも大歓迎です。

Profile.rb

has_many :categorizations
has_many :subjects, through: :categorizations

Subject.rb

has_many :categorizations
has_many :profiles, through: :categorizations

分類.rb

belongs_to :profile
belongs_to :subject

ビュー/検索/index.html.erb

# search form
<%= form_tag search_index_path, :method => 'get' do %>
  <%= text_field_tag :search, params[:search] %>
  <%= submit_tag "search", :name => nil %>
<% end %>

# search results
<% @profiles.each do |profile| %>
  <%= profile.name %>
<% end %>

search_controller.rb

def index
  @profiles = Profile.with_translations('en').all
end
4

3 に答える 3

4
@profiles = Subject.where("name LIKE ?", "%#{params[:search]}%").map(&:profiles)
于 2013-10-23T00:18:33.117 に答える
4

これに追加するのは、full text searchingRails のアイデアです。検索を実行している場合、実際には DB で全文の「検索」クエリを実行していることに注意する必要があります。これは、使用する SQL エンジンによって異なります。


MYSQL 全文検索

このLIKE %{search}%メカニズムは MYSQL の非常に基本的な全文検索機能であり、基本的には DB 内のレコード全体からターゲット クエリを探します。これは、クエリが次の場合を意味します。

SELECT * FROM `products` WHERE `name` LIKE '%alligator%'

MYSQL は基本的に、クエリへの参照がないか「name」レコード全体を調べます。結果は、記録に「アリゲーター」という単語が含まれているかどうかに基づいています。このリファレンスでは、これについてさらに説明しています


PostgreSQL 全文検索

私がこの記事を書いた理由は、PSQL が実際にこれを別の方法で行うためです。したがって、提供されたクエリは MYSQL でのみ機能します。PSQL には全文検索を処理するさまざまな機能がありますが、Heroku を使用しているため、Textacular gemを使用してすべてを適切に機能させることができました。

以下に、PSQL が全文検索を処理するいくつかの方法を示します

PostgreSQL での全文検索は、一致演算子 @@ に基づいており、tsvector (ドキュメント) が tsquery (クエリ) と一致する場合に true を返します。どのデータ型が最初に書き込まれるかは問題ではありません。

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat &
rat'::tsquery;  ?column?
----------  t

SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat
rat'::tsvector;  ?column?
----------  f 

上記の例が示すように、tsquery は単なる生のテキストではなく、tsvector > と同様です。tsquery には、正規化された語彙素である必要がある検索用語が含まれており、AND、OR、および NOT 演算子を使用して複数の用語を組み合わせることができます。(詳細については、セクション 8.11 を参照してください。) ユーザーが記述したテキストを適切な tsquery に変換するのに役立つ関数 to_tsquery および plainto_tsquery があります。たとえば、テキストに表示される単語を正規化します。同様に、to_tsvector はドキュメント文字列の解析と正規化に使用されます。したがって、実際には、テキスト検索の一致は次のようになります。

SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');  ?column? 
----------  t Observe that this match would not succeed if written as

SELECT '太った猫が太ったネズミを食べた'::tsvector @@ to_tsquery('太った & ネズミ'); ?桁?---------- f


全文検索ソフトウェア

全文検索は、特に検索するデータが大量にある場合、DB で本質的に非常にコストがかかります。そのため、 sunspot solrsphinxなどのソリューションが存在し、データのインデックス作成と検索の両方を行う方法を提供します。

アプリケーションが非常に人気になった場合は、Heroku で実証されているような全文検索システムの 1 つに投資することをお勧めします。

Heroku の全文検索パッケージ

于 2013-10-23T09:05:24.987 に答える
2

これが機能するかどうかを確認します。

@profiles = Profile.joins(:subjects).where("subject.name like '%?%'",params[:search])
于 2013-10-23T05:46:30.850 に答える