NoMethodError未定义的方法`fields'代表nil:NilClass

时间:2012-02-29 15:10:30

标签: ruby-on-rails memory nomethoderror

使用:Rails 3.1.1

我正在尝试在我的应用程序中创建一个搜索引擎,用于浏览大型数据库(apprx 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。狮子
数据库: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变量。

4 个答案:

答案 0 :(得分: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|

答案 1 :(得分: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)

希望这有帮助。

答案 2 :(得分:1)

我改为mysql而不是mysql2适配器,它解决了这个问题。谢谢大家的尝试!我在拍摄你的建议时遇到了很多麻烦。

答案 3 :(得分:0)

对于您拥有大量对象的情况,您可以考虑使用find_each and find_in_batches methods或某种分页。