2

UsersController のインデックス:

@users = current_user.other_users.where("first_name like ?", "%#{params[:q]}%")

1) 検索は、最初の文字が検出されないことを除いて、テキスト フィールドで正常に機能します。

例: 「John」を「J」で検索しても結果は得られませんが、「o」を入力すると、当然のことながら「John」が表示されます。

2) 上記の検索条件を last_name に追加する方法を知りたいのですが...? みたいなことを思った

.where("first_name like ? or last_name like ?", "%#{params[:q]}%")

動作しますが、動作しません...

助けてください!

4

3 に答える 3

3

LIKE 句で大文字と小文字が区別される Postgres をデータベースとして使用していると思います。Postgres で大文字と小文字を区別せずに検索するには:

.where("first_name ILIKE ? or last_name ILIKE ?", "%#{params[:q]}%")

この SO には多くの背景があります。MySQL と Postgres の両方に対して、大文字と小文字を区別しないクエリをどのように作成しますか?

他の選択肢:

于 2012-08-13T15:37:42.473 に答える
1
  1. なぜこれが一致しないのかわかりません。' 'たぶん、パラメータの周りに追加する必要があります:"first_name like '?'"

  2. そこには2つのパラメーターが必要だと思います:

.where("first_name like ? or last_name like ?", "%#{params[:q]}%", "%#{params[:q]}%")

于 2012-08-02T15:47:24.820 に答える
0

最初の文字が検出されない理由は、where ステートメント内の姓と名の列の前に % があるためです。その後ろには何もないので、それがうまくいかないJ理由です。%John%

before と after ステートメントの両方を探す必要があります。

これはうまくいくでしょう。

q1 = params[:q].to_s + '%'
q2 = '%' + q1
where(["first_name LIKE ? OR last_name LIKE ? OR first_name LIKE ? OR last_name LIKE", q1,q1,q2,q2])

次に、SQL ステートメントに UNIQUE を入れて、それらをすべて一意の行にします。

とにかく、この種のものには全文検索インデックスを使用することをお勧めします。これは、LIKE 操作がフロント操作とバック操作に対してインデックス化されていないためです (フロントのみ)。これは、MySQL を DB バックエンドとして使用していることを前提としています。

于 2012-08-13T15:26:21.253 に答える