这
u = User.first
u.clients.find_or_create_by_email('example@example.com')
如果您设置了 has_many 关系,则可以使用。但是,如果您在 Client 对象上设置了任何验证,它不会引发验证错误,并且如果验证失败,它将静默失败。
您可以在执行时检查控制台中的输出
u.clients.find_or_create_by_email('example@example.com') # => #<Client id: nil, email: 'example@example.com', name: nil, user_id: 1, another_attribute: nil, active: true, created_at: nil, updated_at: nil>
并且将设置 user_id 但不会设置客户端的 ID,因为验证失败并且未创建客户端
因此,只有在您传递了客户端对象的所有必需属性并且客户端对象的验证已成功通过时,这才应该创建客户端。
因此,假设您的客户端模型除了电子邮件之外还对名称进行了验证,那么您应该这样做
u.clients.find_or_create_by_email_and_name('example@example.com', 'my_name') #=> #<Client id: 1, email: 'example@example.com', name: 'my_name', user_id: 1, another_attribute: nil, active: true, created_at: "2009-12-14 11:08:23", updated_at: "2009-12-14 11:08:23">