0

そこで、ブログアプリに検索を組み込みました。私の開発環境はローカルホストでmysql2を実行しています。次のコードは、開発環境で完全に機能します。

class SearchController < ApplicationController

def index
 if params[:s]== ""
   #do nothing
 elsif params[:s]== "all posts"
   @posts = Post.page(params[:page]).per_page(7).order("id DESC").all
 else
   @posts = Post.page(params[:page]).per_page(7).order("id DESC").find(:all, :conditions=> ["title like ?", "%"+params[:s] + "%"])
 end
end

しかし、PGを使用するHerokuにプッシュすると、動作しなくなります。@posts = Post.page(params[:page]).per_page(7).order("id DESC").find(:all, :conditions=> ["title like ?", "%"+params[:s] + "%"])pgで動作するように変更する必要があるものはありますか?

ありがとう!

4

1 に答える 1

6

最初の間違いは、開発環境と本番環境で異なるデータベースを使用していることです。これは本当に悪い考えです。特に、これらのデータベースの1つがMySQLのようにずさんで、もう1つがPostgreSQLのように厳密である場合はなおさらです。自分でこれを行わないでください。PostgreSQLの上にデプロイする場合は、開発環境でPostgreSQLをセットアップし、両方の環境で同じPostgreSQLバージョンを使用していることを確認してください。

2番目の間違いは最初の間違いに関連しています:MySQLLIKEは通常、大文字と小文字を区別しません:

次の2つのステートメントは、オペランドの1つがバイナリ文字列でない限り、文字列の比較で大文字と小文字が区別されないことを示しています。

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0

ただし、PostgreSQLは大文字と小文字を区別し、大文字とILIKE小文字を区別しないマッチングを提供します。

ILIKE代わりにキーワードを使用LIKEして、アクティブなロケールに応じて大文字と小文字を区別しないようにすることができます。

だからあなたは使いたい

Page.where('title ilike ?', "%#{params[:s]}%")...

PostgreSQLで。そして、何かが両方でほぼ同じように機能することを望む場合は、おそらくすべてを手作業でダウンケースすることで逃げることができます:

Page.where('lower(title) like lower(?)', "%#{params[:s]}%")...

ただし、全文検索システムを調べたいと思うかもしれませんが、LIKEクエリはテーブルスキャンを作成する簡単な方法であることが多く、テーブルスキャンが好きな人は誰もいません。

于 2012-11-14T19:04:25.097 に答える