私はレールに慣れていないので、私の質問には簡単な答えがあるかもしれません。レール3.2.3を使用しています。データベースで検索を実行するための次のコードがあります。
@search_results = User.search("test search")
私のモデルのどこsearch
で定義されていますか。@search_results = Data.search("test search")
このコードは、開発環境のビューまたはコントローラーのいずれかにある場合に完全に機能します。本番環境では、ビューでは機能しますが、コントローラーでは機能しません。どうしてか分かりません。私の本番ログを見ると、ビューとコントローラーのSQLに大きな違いがあります。
クエリが本番環境のビューからのものである場合、これはログに表示されるものです。
SELECT 'users'.* FROM 'users' WHERE (concat(field1, ' ', field2, ' ', field3) LIKE '%test%' AND concat(field1, ' ', field2, ' ', field3) LIKE '%search%'
それがまさに私が望んでいることです。ただし、クエリがコントローラからのものである場合、SQLは次のようになります。
SELECT 'users'.* FROM 'users' WHERE (field1 LIKE '%test search%' OR field2 LIKE '%test search%' OR field3 LIKE '%test search%')
この変更を作成するために、実稼働環境のコントローラーが何をしているのかわかりません。
編集-search
方法は次のとおりです。
def self.search(search)
if search
search_length = search.split.length
find(:all, :conditions => [(["concat(field1, ' ', field2, ' ', field3) LIKE ?"] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}%" })
else
find(:all)
end
end
私は本番環境と開発環境の両方でMySQLを使用しています。