请考虑以下事项:
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
哪个有道理。但是,有没有一个干净/建议的方法来处理这个问题,所以在我要求经理的名字之前,我并不总是需要检查一下员工是否真的有经理?</ p>
答案 0 :(得分: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,则等效。)
答案 1 :(得分:2)
不要试图太聪明。如果您要重复使用它,请将其设为一个功能。
class Employee
def manager_name
manager.try(:name).to_s # force empty string for nil
end
end
答案 2 :(得分:0)
您可以使用has_attribute?
方法进行检查:
employee.has_attribute? :manager
类似于:
puts employee.manager.name if employee.has_attribute? :manager
答案 3 :(得分:0)
我倾向于选择puts employee.manager.try(:name)
如果在nil
上调用了try方法,则会返回nil
,但如果manager
不是nil,则会正确执行该方法。
如果您想要默认文字:
puts employee.manager.try(:name) || "No Manager"