Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails/ActiveRecord-如何使其更简洁?_Ruby On Rails_Ruby - Fatal编程技术网

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选项。我个人会在自己的回答上同意这一点。