Использование: Rails 3.1.1
Я пытаюсь создать поисковую систему в своем приложении, которая просматривает большую базу данных (около 100 000 элементов) для поиска совпадений строк.
Я использую следующее:
fp = FeededProduct.where("name LIKE '%blue%' OR description LIKE '%blue%' OR category LIKE '%blue%'")
для поискового запроса "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 OS X 10.7.2. Lion
База данных: InnoDB
Адаптер: Mysql2 (не знаю, какая версия)
Stack:
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 Дополнительная диагностика:
, чтобы создать действительно большой массив хитов, и он работал нормально. Поэтому я предполагаю, что это исключает мое предположение, что переменная fp не может содержать определенное количество элементов.
Кажется, суть проблемы в том, что если я использую:
fp = FeededProduct.where("name LIKE '%blue%' OR description LIKE '%blue%' OR category LIKE '%blue%'")
Я не могу использовать переменную fp для чего-либо без сбоя приложения.