0

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

user.subscription.nil?

user.subscription

在模型中:订阅

belongs_to :user

用户

has_one :subscription
4

3 回答 3

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
于 2013-09-11T10:02:57.310 回答
1

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

于 2013-09-11T09:25:44.780 回答
1

在用户模型中,

has_one :subscription

在订阅模型中,

belongs_to :user

这里已经定义了用户和订阅表之间的关联,即一对一。

所以在 Rails 中,我们将记录作为对象处理。所以一旦你有了用户记录,你就可以得到它的关联对象。在这种情况下user是用户类的对象。所以user.subscription返回包含user_id等于的订阅类的对象user.id

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

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

于 2013-09-11T09:36:42.340 回答