Ruby on rails Rails/ActiveRecord-如何使其更简洁?
在我看来,我有这样一句话:Ruby on rails Rails/ActiveRecord-如何使其更简洁?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在我看来,我有这样一句话: <%= @house.person.phone_number unless @house.person.nil? %> 似乎我必须经常做这种事情,因为有些字段是可以为空的 有没有更好的方法写这个 我可以在模型层处理它,但据我所知,这并不是真正的模型层功能。这些类型的问题当然可以通过在房子中包装人的方法来包装在模型中,从而在过程中暴露较少的信息 def person_phone_number @person.phone_number || "
<%= @house.person.phone_number unless @house.person.nil? %>
似乎我必须经常做这种事情,因为有些字段是可以为空的
有没有更好的方法写这个
我可以在模型层处理它,但据我所知,这并不是真正的模型层功能。这些类型的问题当然可以通过在房子中包装人的方法来包装在模型中,从而在过程中暴露较少的信息
def person_phone_number
@person.phone_number || ""
end
有点笨重;您还可以将它们元编程到适当的位置
或创建助手,或两者的组合。这是一个典型的问题,在我看来,将其包装在包含模型中没有什么错。您可以使用@house.person.try(:phone_number)
您可以使用活动记录支持的方法
delegate:phone\u number,:to=>:person,:allow\u nil=>true
直接拨打@house.电话号码
,避开人
中间人。如果电话是零,这也将返回零。请告诉我。。虽然我也在一定程度上支持戴夫的回答。德米特定律很好,但如果@person为零,戴夫的回答并不能解决问题。我喜欢你的。尝试一下方法,但有两件事:1。如果person模型根本没有phone\u number
属性/方法,那么它会以静默方式失败,因此调试变得很棘手。2. <代码>.try
仅受较新版本的支持ruby@sled#try
是用rails修补的。响应您的#1,OP正在视图中使用它,因此调试不会成为问题。@sled#try
对于对象上的未定义方法(NilClass的实例除外)不会自动失败。+1-从不知道all#nil选项。我个人会在自己的回答上同意这一点。