我可以将基于动态属性的查找器范围限定为对象吗?

时间:2009-12-14 09:50:37

标签: ruby-on-rails has-many dynamic-finders

别介意我,我把我的属性名称搞砸了:(

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


我似乎无法让这个工作,并且似乎是一个通用的场景,必须有一个解决方案,但我没有运气正确的术语来获得有用的Google结果。

我想这样做:

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

使用Client创建新的user_id = u.id

我可以通过has_many关系获得漂亮的动态查找器吗?如果没有,为什么?

感谢:)

2 个答案:

答案 0 :(得分: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">

答案 1 :(得分:0)

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