2012-03-27 44 views
0

比方说,我有一个汽车和驱动程序数据库,但对于某些记录,没有汽车司机。我如何映射关系?Rails - 数据库关系

这里是我的代码,它会导致“NoMethodError:未定义的方法`每个”近亲:NilClass”的错误

class Car < ActiveRecord::Base 
    has_one :driver, :foreign_key => :dr_code, :primary_key => :ca_master_code 
end 

class Driver < ActiveRecord::Base 
    belongs_to :car, :foreign_key => :dr_code, :primary_key => :ca_master_code 
end 

请指教。

+0

顺便说一句,有什么理由你不遵循Rails列命名约定? – 2012-03-27 19:50:33

+0

我正在使用传统数据库。 – oprogfrogo 2012-03-27 20:15:09

回答

1

假设在这种情况下nil表示那里没有司机。这不是一个数据库设计问题。

如果没有驾驶员的汽车是有效的情况(而不是创建记录中的错误),那么只需处理nil的情况。

+0

感谢您的回复。我期望Active Record将没有驱动程序的那些返回为零,但是它会抛出一个我无法拯救的异常。没有rails有'has_one_or_none'类型的关系吗? – oprogfrogo 2012-03-27 19:54:29

+0

那么,你在一个'nil'对象上调用'.each',它总是会抛出一个异常。你不需要从中解救;在尝试调用它上面的'each'之前,只需检查它是否为'nil'。 – jefflunt 2012-03-27 21:01:04

0

实际上,Rails做得非常好。我假设你在car.driver上打电话each。由于该车没有司机,car.drivernilnil.each barfs。

+0

顺便说一句,你为什么要在has_one关系中调用'each'? – 2012-03-27 19:53:07

+0

每个人都被称为我相信由于在查询中使用include执行'find_all'。 Car.find_all_by_ca_active('Y',:include => [:driver])。在控制台中执行该查询会返回该错误。我在这里做错了什么? – oprogfrogo 2012-03-27 20:17:09

+0

'Car.find_all_by_ca_active('Y')'没有:include?的输出是什么? – 2012-03-27 20:33:14