1

Railsの使用3.2。私は次の表を持っています:

name                 address
=======================================
Hilton Hotel         New York, USA
Hilton Hotel         Paris, France
Mandarin Hotel       Chicago, USA
Le Meridien Hotel    New York, USA

および次のクエリ:

term = "%#{params[:term]}%"
shops = Shop.limit(10).where("name LIKE ? OR address like ?", term, term)

私の期待する結果はこれです:

Search - "Hilton"
Result - "Hilton Hotel, New York, USA"; "Hilton Hotel, Paris, France"

Search - "Hilton USA"
Result - "Hilton Hotel, New York, USA"

Search - "New York"
Result - "Hilton Hotel, New York, USA"; "Le Meridien Hotel, New York, USA"

クエリをどのように書き直す必要がありますか?

ありがとう。

4

2 に答える 2

1

MySQLのMATCHAGAINSTを使用できます。Railsには直接のサポートはありませんが、Railsで独自のカスタムクエリをいつでも使用できます。

YourModel.find_by_sql("SELECT ... WHERE MATCH(...) AGAINST(...)")

またはもう少しRailsスタイル(これはテストしていません):

YourModel.where("MATCH(...) AGAINST(...)")

詳細については、こちらをご覧ください:http: //dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html

編集: 入力文字列をスペース、コンマ、ドットなどで分割し、MATCHAGAINSTを使用してすべての結果を取得します。したがって、このテーブルがある場合:

      col1 | col2
      -----------
row1: a c  | a
row2: a d  | b e
row3: b e  | a d
row4: b    | b c

そして、ユーザーaは入力として入力します。やったほうがいい

MATCH(col1, col2) AGAINST ('a')

これは戻ります:

row1: 'a c', 'a'
row2: 'a d', 'b e'
row3: 'b e', 'a d'
于 2013-02-17T16:45:24.317 に答える
0

これには別の回避策を使用します。

別の列を作成し、 andfor_autocompleteを連結します。レコードが作成/更新されるたびに、それに応じて作成/更新されます。次に、列を検索します。nameaddressfor_autocompletefor_autocomplete

于 2013-02-19T04:01:11.867 に答える