Rails复杂如果

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版本的未知方法)的简单方法.


Nic*_*nil 7

考虑这种更优雅的方法:

订购:

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为零,用户为零,或者电子邮件为零,则返回用户的电子邮件或"未找到".