Rails 为 has_one 关系创建了许多对象

Rails creates many objects for has_one relationship

我的 Rails 5 应用程序中有两个模型 - UserLogin 具有以下关联:

class User < ApplicationRecord
  belongs_to :login, optional: true
end

class Login < ApplicationRecord
  has_one :user
end

我认为这样的关联会阻止登录拥有多个用户,但事实证明,在 Login.last 已经有关联的用户对象的情况下:

2.4.5 :108 > Login.last.user
 => #<User id: 1, type: "Registrant", login_id: 43, first_name: "test", last_name: "test", created_at: "2022-02-11 11:22:25", updated_at: "2022-02-11 11:22:25">

您仍然可以使用相同的登录名创建新用户:

User.create(first_name: 'test2', last_name: 'test2', login_id: 43
 => #<User id: 2, login_id: 43, first_name: "test2", last_name: "test2", created_at: "2022-02-11 12:03:36", updated_at: "2022-02-11 12:03:36">

但是当您尝试获取最后登录的用户时,您将获得第一个创建的用户:

Login.last.user
=> #<User id: 1, type: "Registrant", login_id: 43, first_name: "test", last_name: "test", created_at: "2022-02-11 11:22:25", updated_at: "2022-02-11 11:22:25">

如何防止使用已经使用过一次的登录名创建新用户?

您可以使用验证来表示登录只能由一个用户使用。 这在模型用户中看起来像这样:

validates :login_id, uniqueness: true