2

考虑以下:

class Manager < ActiveRecord::Base
  has_many :employees
end
class Employee < ActiveRecord::Base
  belongs_to :manager
end


employee = Employee.first
puts employee.manager.name

如果由于某种原因员工没有经理,我会得到:

undefined method `name' for nil:NilClass

这是有道理的。但是,有没有一种干净/建议的方法来处理这个问题,所以在我询问经理的名字之前,我不必总是检查员工是否真的有经理?

4

4 回答 4

4

尝试:

puts employee.manager.name unless employee.manager.nil?

或者:

puts (employee.manager.nil? ? "No manager" : employee.manager.name)

在这种情况下相当于:

puts (employee.manager ? employee.manager.name : "No manager")

(只要employee.manager 不能返回false,就等价。)

于 2013-05-08T21:49:44.140 回答
2

不要试图太聪明。如果您要重复使用它,请将其设为函数。

class Employee
   def manager_name
     manager.try(:name).to_s # force empty string for nil        
   end
end
于 2013-05-08T22:34:10.937 回答
0

您可以使用以下has_attribute?方法进行检查:

employee.has_attribute? :manager

所以像:

puts employee.manager.name if employee.has_attribute? :manager
于 2013-05-08T21:53:23.937 回答
0

我倾向于更喜欢puts employee.manager.try(:name)

try 方法nil在被调用时返回,但如果不是 nilnil将正确执行该方法。manager

如果你想要默认文本:

puts employee.manager.try(:name) || "No Manager"
于 2013-05-08T22:31:08.137 回答