在我看来,我有一行如下:
<%= @house.person.phone_number unless @house.person.nil? %>
似乎我必须做很多这样的事情,因为有些字段可以为空。
有没有更好的方法来写这个?
我可以在模型层处理它,但根据我的理解,这并不能真正模拟图层功能。
答案 0 :(得分:5)
您可以使用有效记录支持的delegate方法。
delegate :phone_number, :to => :person, :allow_nil => true
直接致电@house.phone_number
,避开person
中间人。如果手机为零,则也会返回零。
答案 1 :(得分:4)
您可以使用@house.person.try(:phone_number)
答案 2 :(得分:2)
通过在Person
中包含House
的方法,可以在模型中包含这些Strongly-Worded Suggestion of Demeter类型的问题,从而在流程中公开更少的信息。
def person_phone_number
@person.phone_number || ""
end
有点笨重;你也可以对它们进行元编程。
或创建助手或两者的组合。这是一个典型的问题,IMO将其包含在包含的模型中没有任何问题。