5

使用: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を使用することはできません。

4

4 に答える 4

1

search_results_controller.rbの190行目にコードを投稿できますか?また、showメソッドの「fields」属性を参照している可能性のある他のコードを投稿できますか?app / models/feeded_product.rbからのモデルFeededProductの関連部分も

app/controllers/search_results_controller.rb:190:in `show'

あなたが投稿した情報から、どのフィールドが何を指しているのかは明確ではありません。実行する必要があるのは、タイプミス、不正なコード、または移行である可能性があります。

また、注意してください

fp.each.do |prod|

構文的に正しくありません。そのはず:

fp.each do |prod|
于 2012-03-06T08:31:55.447 に答える
1

代わりに、そのfpロジックをモデルに移動した場合はどうなりますか?

class Item < ActiveRecord::Base
  ...
  def self.feeded_products(query)
    self.where("name LIKE '%#{query}%'  OR description LIKE '%#{query}%'  OR category LIKE '%#{query}%'")
  end
  ...
end

...そして、コントローラーで、次のように呼び出すことができます。

Item.feeded_products(query)

お役に立てれば。

于 2012-03-08T09:05:29.907 に答える
1

mysql2アダプターではなくmysqlに変更したところ、問題は解決しました。みんなありがとう!私はあなたの提案を撮影するのに多くの問題を学びました。

于 2012-03-19T06:26:58.943 に答える
0

オブジェクトのセットが大きいこれらの状況では、find_eachメソッドとfind_in_batchesメソッドの使用、またはある種のページ付けを検討できます。

于 2012-03-06T18:31:56.853 に答える