0

Prostgres と Sinatra で Sequel を使用しています。オートコンプリート検索をしたい。GET を送信する jQuery が正常に動作することを確認しました。

Ruby コードは次のとおりです。

get '/search' do
  search = params[:search]
  DB[:candidates].select(:last).where('last LIKE ?', '_a_').each do |row|
    l = row[:last] 
  end
end

問題は Sequel クエリです。

考えられるクエリのすべての構成を試してみましたが、うまくいきませんでした。

したがって、たとえば、上記のクエリでは、姓に「a」が含まれるすべての人を取得しますが、クエリを次のように変更すると:

DB[:candidates].select(:last).where('last LIKE ?', 'search')

また

DB[:candidates].select(:last).where('last LIKE ?', search)  # (without '')

私は何も得ません。

warn params.inspectパラメータ検索が渡されたことを示すことを行ったので、行き詰まりました。

クエリをどのように記述すべきかについてのアイデアはありますか?

最後に、結果の質問の 2 番目の部分 (で動作する場合'_a_') は、ヤオだけのようにレンダリングされます{:last=>"Yao"}。どうすればそれができますか?

生のSQLを含むさまざまな種類のクエリを試しましたが、うまくいきませんでした。それとも、アプローチが単に間違っているのでしょうか?

4

2 に答える 2

0

Sequel ドキュメントからのコピー/貼り付け:

Sequel.like次のメソッドを使用して、大文字と小文字を区別して SQL 文字列を検索できます。

items.where(Sequel.like(:name, 'Acme%')).sql
#=> "SELECT * FROM items WHERE (name LIKE 'Acme%')"

Sequel.ilike次のメソッドを使用して、大文字と小文字を区別しない方法で SQL 文字列を検索できます。

items.where(Sequel.ilike(:name, 'Acme%')).sql
#=> "SELECT * FROM items WHERE (name ILIKE 'Acme%')"

like 引数として Regexp を指定できますが、これはおそらく PostgreSQL と MySQL でのみ機能します。

items.where(Sequel.like(:name, /Acme.*/)).sql
#=> "SELECT * FROM items WHERE (name ~ 'Acme.*')"

Like は複数の引数を取ることもできます:

items.where(Sequel.like(:name, 'Acme%', /Beta.*/)).sql
#=> "SELECT * FROM items WHERE ((name LIKE 'Acme%') OR (name ~ 'Beta.*'))"

Sequel コンソール(Sinatra アプリではない) を開き、結果が返されるまでクエリを試します。列のみが必要だと言うのでlast、クエリは次のようになります。

# Search anywhere inside the last name
DB[:candidates].where( Sequel.ilike(:last, "%#{search}%") ).select_map(:last)

# Find last names starting with the search string
DB[:candidates].where( Sequel.ilike(:last, "#{search}%") ).select_map(:last)

より醜い代替案:

DB[:candidates]
  .select(:last)
  .where( Sequel.ilike(:last, "%#{search}%") )
  .all
  .map{ |hash| hash[:last] }

DB[:candidates]
  .select(:last)
  .where( Sequel.ilike(:last, "%#{search}%") )
  .map( :last )

検索結果を最高の一致でランク付けしたい場合は、私の無料のLiqrrdMetalライブラリに興味があるかもしれません. DB で検索する代わりに、すべての姓の完全なリストを Ruby に取り込み、LiqrrdMetal を使用してそれらを検索します。これにより、「pho」の検索文字列が「Phong」と「Phrogz」の両方に一致し、前者のスコアがランキングで高くなります。

于 2013-06-15T04:25:35.470 に答える