0

别介意我,我把我的属性名弄乱了:(

这完全有可能,使用我使用的确切语法 - 你只需要能够拼写!


我似乎无法让它工作,而且这似乎是一个足够常见的场景,必须有一个解决方案,但我没有任何运气使用正确的术语来获得有用的谷歌结果。

我想做这个:

u = User.first
u.clients.find_or_create_by_email('example@example.com')

Client效果是用 . 创建一个新的user_id = u.id

我可以通过has_many关系获得好的动态发现者吗?如果不是,为什么?

谢谢:)

4

2 回答 2

0

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">
于 2009-12-14T11:03:55.440 回答
0

这完全有可能,使用我使用的确切语法 - 你只需要能够拼写!

于 2010-02-09T23:30:48.890 回答