use*_*756 1 ruby refactoring ruby-on-rails
我想知道在Rails中输出这个的漂亮方式是什么.
order.items.min.user.email
Run Code Online (Sandbox Code Playgroud)
我想展示电子邮件的价值,我唯一知道的是订单不是零,但是商品和用户可能是零.
我看到的唯一方法是
if !order.items.empty?
if !order.items.min.user.nil?
if !order.items.min.user.email.nil?
order.items.min.user.email
end
end
end
Run Code Online (Sandbox Code Playgroud)
它看起来不是最好的方式,你知道更好的方法吗?
mu *_*ort 14
您可以使用try(或try!取决于您的Rails3版本以及您希望如何处理未知方法):
order.items.try(:min).try(:user).try(:email)
Run Code Online (Sandbox Code Playgroud)
try是一种nil在长方法调用链中吞下s(以及取决于你的Rails版本的未知方法)的简单方法.
考虑这种更优雅的方法:
订购:
class Order < ActiveRecord::Base
has_many :items
end
Run Code Online (Sandbox Code Playgroud)
项目:
class Item < ActiveRecord::Base
belongs_to :user
delegate :email, to: :user, allow_nil: true, prefix: true # You can remove the prefix true and call item.email instead item.user_email
end
Run Code Online (Sandbox Code Playgroud)
然后:
order.items.min.try(:user_email)
Run Code Online (Sandbox Code Playgroud)
要么:
order.items.min.try(:user_email).presence || "Not found"
Run Code Online (Sandbox Code Playgroud)
如果items.min为零,用户为零,或者电子邮件为零,则返回用户的电子邮件或"未找到".
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |