Rails复杂如果

时间:2013-08-28 04:38:29

标签: ruby-on-rails ruby refactoring

我想知道在Rails中输出这个的漂亮方式。

order.items.min.user.email

我想展示电子邮件的价值,我唯一知道的是订单不是零,但商品用户可能是零。

我看到的唯一方法是

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

看起来不是最好的方式,你知道更好的方法吗?

2 个答案:

答案 0 :(得分:14)

您可以使用try(或try!,具体取决于您的Rails3版本以及您希望如何处理未知方法):

order.items.try(:min).try(:user).try(:email)

try是一种在长方法调用链中吞下nil(以及未知方法,具体取决于您的Rails版本)的简单方法。

答案 1 :(得分:7)

考虑这种更优雅的方法:

订单:

class Order < ActiveRecord::Base
  has_many :items
end

档案:

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

然后:

order.items.min.try(:user_email) 

或:

order.items.min.try(:user_email).presence || "Not found"

如果items.min为零,用户为零或电子邮件为零,则返回用户的电子邮件或“未找到”。