Mysql 未定义的方法`代码';for nil:NilClass消息,带有rails和遗留数据库

Mysql 未定义的方法`代码';for nil:NilClass消息,带有rails和遗留数据库,mysql,ruby-on-rails,Mysql,Ruby On Rails,我正在设置一个非常简单的rails 3应用程序来查看遗留MySQL数据库中的数据。遗留数据库主要与rails ORM兼容,但外键字段是复数的。例如,我的“订单”表在“公司”表中有一个外键字段,称为“公司id”(而不是“公司id”)。因此,很自然地,我必须使用“属于”的“:foreign_key”属性来手动设置字段名 我已经有几年没有使用rails了,但是我很确定我做的一切都是正确的,但是当我尝试访问“order.currency.code”时,我遇到了以下错误: 到目前为止,这是一个非常简单的应

我正在设置一个非常简单的rails 3应用程序来查看遗留MySQL数据库中的数据。遗留数据库主要与rails ORM兼容,但外键字段是复数的。例如,我的“订单”表在“公司”表中有一个外键字段,称为“公司id”(而不是“公司id”)。因此,很自然地,我必须使用“属于”的“:foreign_key”属性来手动设置字段名

我已经有几年没有使用rails了,但是我很确定我做的一切都是正确的,但是当我尝试访问“order.currency.code”时,我遇到了以下错误:

到目前为止,这是一个非常简单的应用程序。我所做的唯一一件事就是为每个遗留数据库表生成应用程序和一堆框架。然后,我对一些模型进行了调整,以适应上述数据库命名约定的差异,并在视图中添加了一些字段。就这样。没有有趣的事

因此,我的数据库表如下所示(仅限相关字段):

我的订单模型如下所示:

class Order < ActiveRecord::Base
  belongs_to :currency, :foreign_key=>'currencies_id'
end
class Currency < ActiveRecord::Base
    has_many :orders
end
<% @orders.each do |order| %>
  <tr>
    <td><%= order.description %></td>
    <td><%= order.invoice_number %></td>
    <td><%= order.currency.code %></td>
  </tr>
<% end %>
类顺序'currences\u id'
结束
我的货币模型如下所示:

class Order < ActiveRecord::Base
  belongs_to :currency, :foreign_key=>'currencies_id'
end
class Currency < ActiveRecord::Base
    has_many :orders
end
<% @orders.each do |order| %>
  <tr>
    <td><%= order.description %></td>
    <td><%= order.invoice_number %></td>
    <td><%= order.currency.code %></td>
  </tr>
<% end %>
class Currency
相关的视图片段如下所示:

class Order < ActiveRecord::Base
  belongs_to :currency, :foreign_key=>'currencies_id'
end
class Currency < ActiveRecord::Base
    has_many :orders
end
<% @orders.each do |order| %>
  <tr>
    <td><%= order.description %></td>
    <td><%= order.invoice_number %></td>
    <td><%= order.currency.code %></td>
  </tr>
<% end %>


我完全没有主意了。有什么建议吗?

在大多数情况下,发生这种情况是因为未设置某些顺序的外键。你可以这样在你的视野中处理它

<%= order.currency.nil? ? 'no currency' : order.currency.code %>

或者干脆


要进行检查,您可以将外键(
currencies\u id
)的值打印到日志中,就在错误行的前面。

或者由于您使用的是运行在ruby 1.9.2上的rails 3应用程序,您也可以使用
orer.currency.try(:code)
,以获得可能为零的属性。正如Nikita Rybak所指出的那样,这个错误是肯定的,现在我又开始意识到了。我记得很多年前我第一次开始使用rails时,我一直在努力解决这些空问题。非常感谢你。就是这样。你的词形变化不会让外键的需要变得无关紧要吗?另外,您可能要使用order.currency.blank?还是相反的顺序。货币。现在?只是因为它捕捉到了一两个以上的属性,然后它自己的属性为零。