1

我想知道在 Rails 中输出这个的漂亮方法是什么。

order.items.min.user.email

我想显示email的价值,我唯一知道的是order不是 nil,但是itemsuser可能是 nil。

我看到的唯一方法是

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

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

4

2 回答 2

14

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

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

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

于 2013-08-28T04:47:16.257 回答
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 为 nil、user 为 nil 或 email 为 nil,它将返回用户的电子邮件或“未找到”。

于 2013-08-28T05:04:30.300 回答