NoMethodError - неопределенный метод `fields 'для nil: NilClass - PullRequest
4 голосов
/ 29 февраля 2012

Использование: 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 Дополнительная диагностика:

  • Я пытался с

    fp2 = FeededProduct.limit (60000)

, чтобы создать действительно большой массив хитов, и он работал нормально. Поэтому я предполагаю, что это исключает мое предположение, что переменная fp не может содержать определенное количество элементов.

Кажется, суть проблемы в том, что если я использую:

fp = FeededProduct.where("name LIKE '%blue%'  OR description LIKE '%blue%'  OR category LIKE '%blue%'")

Я не могу использовать переменную fp для чего-либо без сбоя приложения.

Ответы [ 4 ]

1 голос
/ 19 марта 2012

Я перешел на mysql вместо адаптера mysql2, и это решило проблему. Спасибо всем за попытку! Я узнал много проблем, снимая ваши предложения.

1 голос
/ 08 марта 2012

Что если вы переместили эту логику 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)

Надеюсь, это поможет.

1 голос
/ 06 марта 2012

Можете ли вы разместить код в строке 190 в search_results_controller.rb и в любых других, которые, возможно, ссылаются на атрибут "fields" в вашем методе show? Также релевантные части вашей модели FeededProduct из приложения / models / feeded_product.rb

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

Не ясно, на какие поля ссылается информация, которую вы разместили. Это может быть опечатка, плохой код или миграция, которую нужно запустить.

Также обратите внимание, что

fp.each.do |prod|

не является синтаксически правильным. Должно быть:

fp.each do |prod|
0 голосов
/ 06 марта 2012

В этих ситуациях, когда у вас есть большие наборы объектов, вы можете рассмотреть использование find_each и find_in_batches методов или какую-то нумерацию страниц.

...