使用时在mysql2 gem中获取随机的nil.each错误:包含在Rails的查找中

时间:2011-03-10 20:45:49

标签: mysql ruby-on-rails ruby-on-rails-3 activerecord include

我随机(看起来像)在我的localhost上得到一个nil.each错误。对代码感到非常自信,所以我把它推到了heroku,它在那里工作得很好。

这是我的观看代码:

<h2><%=@book.name.upcase%></h2>

<br />

<% @book.chapters.each do |chapter| %>
    <h3>Chapter <%=chapter.number%></h3>
    <% chapter.verses.each do |verse| %>
        <b><%=verse.number%>)</b> <%=verse.body%>
    <% end %>
    <br /><br />
<% end %>

起初,我在控制器中的所有内容都是@book = Book.find(params[:id]),除了速度之外,它的工作正常。然后我改为:

def show
    if params[:book_name]
        #@book = Book.find_by_sql(["select * from books where UPPER(name) = UPPER(?)", params[:book_name]]).first
        @book = Book.where(["UPPER(name) = UPPER(?)", params[:book_name]]).includes(:chapters => :verses).first
        raise ActiveRecord::RecordNotFound, "Page not found" if @book.nil?
    elsif params[:id]
        @book = Book.find(params[:id].to_i, :include => {:chapters => :verses})
    end
end

现在我随机收到此错误:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
...
app/controllers/books_controller.rb:14:in `show'

一个区别是heroku使用postgre而我正在使用mysql Heroku url:http://kjv-on-rails.heroku.com/books/1
完整的应用程序代码:https://github.com/tybro0103/KJV-on-Rails

更新 我刚检查完全跟踪并意识到错误发生在这里:

  

mysql2(0.2.6)   LIB / active_record / connection_adapters / mysql2_adapter.rb:635:在   `select'

因此错误发生在mysql2 gem中。

注意 我注意到我有奇/冗余的关系&amp;数据。我意识到这一点,我保证!我不相信这会导致错误。 :)

注意 随意这里是我的意思...在一些书籍上我从来没有看到这个错误。在其他人看来,我看到90%的时间,而在其他人看来,我看到了50%的时间。我只是一遍又一遍地刷新,有时它可以工作,有时它不会。我想真正明白我的意思的唯一方法就是自己下载代码。我的猜测是没有人会这意味着我会在几天内作为奖励开始赏金。 :)

更新
所以错误发生在mysql2适配器中。有趣的是@book = Book.find(params[:id].to_i, :include => {:chapters => :verses})在运行rails服务器时导致错误。在rails控制台中,我可以整天运行相同的命令,它工作正常。它使用webrick,但我尝试切换到mongrel并得到了同样的错误。我也试过从ruby 1.8.7切换到1.9.2并得到同样的错误。似乎可能在rails服务器中存在某种内存限制?

1 个答案:

答案 0 :(得分:0)

AHHHH ......我找到了麻烦制造者!我只是将mysql从5.5降级到5.1 ......问题一去不复返了! @ $$是多么痛苦。

然而,能够使用最新版本的mysql仍然会很好。如果有人能找到一种方法让它使用mysql 5.5,我会将其标记为已接受的答案。