2012-02-29 56 views
4

使用:Rails的3.1.1NoMethodError未定義的方法`領域的零:NilClass

我想創建我的應用程序的搜索引擎,瀏覽查找字符串匹配的大型數據庫(apprx 100 000項)。

我使用了以下內容:

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

爲 「藍色」 的搜索查詢。

當我運行的等效搜索短語在MySQL中它工作正常,但當我嘗試在軌運行此它顯示:

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 

,但它不會崩潰for:

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-變量沒有任何應用程序崩潰。

+0

您是否處於開發模式?堆棧跟蹤告訴你什麼? – 2012-02-29 15:17:53

+0

是的,我處於開發模式。實際上,我並不知道堆棧跟蹤是什麼(現在使用Google搜索)。如果你參考了Web服務器的終端輸出,它說:ActiveRecord :: StatementInvalid(NoMethodError:未定義的方法'fields'爲nil:NilClass:SELECT'feeded_products'。* FROM'feeded_products' WHERE(名稱LIKE'%blue%'或描述LIKE '%blue%'或者類別LIKE'%blue%')): app/controllers/search_results_controller.rb:190:在'show' – Christoffer 2012-02-29 15:24:07

+0

......也許應該提到這是我的第二個大型Rails項目,我仍然在學習鐵軌。 – Christoffer 2012-02-29 15:25:43

回答

1

我改爲mysql而不是mysql2適配器,它解決了這個問題。感謝大家的努力!我發現你的建議遇到很多麻煩。

1

您可以在第190行的search_results_controller.rb中發佈代碼,以及其他任何可能引用您的show方法中的「fields」屬性的代碼?此外,從應用程序/模型/ feeded_product.rb

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

模型FeededProduct的相關部分目前還不清楚是指哪些領域從您發佈的信息來。這可能是錯字,錯誤代碼或需要運行的遷移。

還要注意的是

fp.each.do |prod| 

不是語法正確。它應該是:

fp.each do |prod| 
+0

edk750:行#190只是respond_to | format | format.html#show.html.erb format.json {render:json => @search_result} end – Christoffer 2012-03-06 12:01:09

+0

關於fp.each.do,它只是一個錯字(我在這裏手動寫過,所以沒關係)代碼)。 – Christoffer 2012-03-06 12:01:47

+0

重要的是我不使用任何方法,屬性或任何稱爲「字段」的東西。我沒有命名任何「字段」,並且數據庫中沒有任何內容稱爲字段。基本上,在整個應用程序的代碼的任何地方都找不到字符串「fields」。 – Christoffer 2012-03-06 12:03:14

0

對於在其中有大量的對象集合,你可以考慮使用find_each and find_in_batches methods或某種分頁的這些情況。

+0

我想這將解決問題,如果它會是一個內存問題。我猜這畢竟不是......解決方案不幸運。不管怎麼說,還是要謝謝你! – Christoffer 2012-03-15 05:51:44

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) 

希望這有助於。

+0

我也會嘗試一下,謝謝! – Christoffer 2012-03-14 14:24:16

+0

現在試過了,但是沒有工作:(同樣的錯誤... – Christoffer 2012-03-15 10:18:15

相關問題