ユーザーのサブスクリプションが設定されていない場合、次の 2 つのコード スニペットは同等ですか。
user.subscription.nil?
と
user.subscription
モデル内: サブスクリプション
belongs_to :user
ユーザー
has_one :subscription
ユーザーのサブスクリプションが設定されていない場合、次の 2 つのコード スニペットは同等ですか。
user.subscription.nil?
と
user.subscription
モデル内: サブスクリプション
belongs_to :user
ユーザー
has_one :subscription
ユーザーモデルでは、
has_one :subscription
サブスクリプションモデルでは、
belongs_to :user
ここでは、ユーザーとサブスクリプション テーブルの間の関連付けが定義されています。つまり、1 対 1 です。
したがって、レールでは、レコードをオブジェクトとして扱います。SOユーザーレコードを取得したら、その関連オブジェクトを取得できます。この場合userは User クラスのオブジェクトです。したがって、と等しい をuser.subscription含むサブスクリプション クラスのオブジェクトを返します。user_iduser.id
また、場合によっては、ユーザーのサブスクリプションがありません。そのため、続行する前に確認する必要があります。そのため、user.subscription.nil?oruser.subscription.blank?またはを使用していuser.subscription.present?ます。これらはブール値を返します。
ここで、ユーザーがサブスクリプションを持っている場合は をuser.subscription.nil?返しfalse、ユーザーがサブスクリプションを持っていない場合は を返しますtrue。
両者は異なるだけでなく、ほとんど正反対です。プロパティが 以外に設定されている場合nil、前者は を返しfalse、後者は任意の値を返します。プロパティが に設定されている場合、nilまたは設定されていない場合、前者はtrue、後者はnilです。2 つが同じ値を返す唯一のケースは、プロパティが に設定されている場合falseです。