相当于:没有?并且没有设置对象

时间:2013-09-11 09:21:30

标签: ruby-on-rails ruby

如果尚未设置用户的订阅,这两个代码段是否等效:

user.subscription.nil?

user.subscription

在模特中: 订阅

belongs_to :user

用户

has_one :subscription

3 个答案:

答案 0 :(得分:2)

如果要检查关联是否,则这些是等效的:

user.subscription.nil?     # true if missing, false otherwise
user.subscription.blank?   # true if missing, false otherwise
!user.subscription         # true if missing, false otherwise

如果你想检查关联是否存在,那么它们是相同的(就真实和虚假而言):

user.subscription.present? # true if present, false otherwise
user.subscription          # subscription if present, nil otherwise
!!user.subscription        # true if present, false otherwise

答案 1 :(得分:1)

不仅它们不同,而且几乎相反。如果属性设置为除nil之外的任何值,则前者将返回false,后者将返回任何值。如果属性设置为nil或未设置,则前者为true,后者为nil。当两者返回相同值时,唯一的情况是属性设置为false

答案 2 :(得分:1)

在用户模型中,

has_one :subscription

在订阅模型中,

belongs_to :user

此处已在用户和子订单表之间定义关联,即一对一。

所以在rails中,我们将记录作为对象处理。因此,一旦您拥有用户记录,您就可以获得其关联对象。在这种情况下,user是User类的对象。 因此user.subscription会返回包含user_id等于user.id的订阅类对象。

在某些情况下,没有订阅用户。所以我们需要在继续之前进行检查。 这就是我们使用user.subscription.nil?user.subscription.blank?user.subscription.present?的原因。这些都是返回布尔值。

如果用户正在订阅,则user.subscription.nil?会返回false,如果用户没有订阅,则返回true