使用:Rails 3.1.1
大規模なデータベース(約100 000アイテム)を参照して文字列の一致を検索する検索エンジンをアプリケーションで作成しようとしています。
私は以下を使用しています:
fp = FeededProduct.where("name LIKE '%blue%' OR description LIKE '%blue%' OR category LIKE '%blue%'")
「青」の検索クエリの場合。
MySQLで同等の検索フレーズを実行すると正常に機能しますが、これをRailsで実行しようとすると、次のように表示されます。
NoMethodError: undefined method `fields' for nil:NilClass: SELECT `feeded_products`.* FROM `feeded_products` WHERE (name LIKE '%blue%' OR description LIKE '%blue%' OR category LIKE '%blue%')
手がかりとトラブルシューティング:
これは大きな検索結果でのみ発生します。数値を区別できませんでしたが、920件の結果が返されるはずのときにクラッシュしましたが、6件の結果が返されてもクラッシュしません。
上記の私の結論は、すべての920の結果をメモリに保持できないか、クラッシュを引き起こす何らかのタイプの行があり、結果が多いほど、そのタイプの行が含まれる可能性が高いということです。私は最初の結論にもっと傾いています。
実行しようとすると(同じエラーコードで)クラッシュするため、トラブルシューティングをうまく行うことができません。
raise fp.inspect
また、次の場合にクラッシュします。
fp.each do |prod|
begin
puts 'Do nothing'
rescue
puts 'Something crashed'
end
ただし、次の場合はクラッシュしません。
raise fp.count.inspect
それで、私は記憶タイプの問題を抱えていますか?これをさらにトラブルシューティングしたり、問題を解決したりするにはどうすればよいですか?
使用:Mac OSX10.7.2。Lion
データベース:InnoDB
アダプター:Mysql2(どのバージョンかわからない)
スタック:
ActiveRecord::StatementInvalid (NoMethodError: undefined method fields' for nil:NilClass: SELECT feeded_products`.* FROM feeded_products WHERE (name LIKE '%blue%' OR description LIKE '%blue%' OR category LIKE '%blue%')): app/controllers/search_results_controller.rb:190:in `show'
編集2012-03-06追加のトラブルシューティング:
で試してみました
fp2 = FeededProduct.limit(60000)
非常に大きなヒットの配列を作成し、それはうまくいきました。したがって、fp変数が特定の量のアイテムを保持できないという私の推測を除外していると思います。
問題の核心は、私が使用した場合、次のように思われます。
fp = FeededProduct.where("name LIKE '%blue%' OR description LIKE '%blue%' OR category LIKE '%blue%'")
その後、アプリケーションがクラッシュしない限り、fp-variableを使用することはできません。