如果尚未设置用户的订阅,这两个代码段是否等效:
user.subscription.nil?
和
user.subscription
在模特中: 订阅
belongs_to :user
用户
has_one :subscription
答案 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
。