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

Ruby on rails 我可以将基于动态属性的查找器范围限定到对象吗?,ruby-on-rails,has-many,dynamic-finders,Ruby On Rails,Has Many,Dynamic Finders,别介意,我已经查到了属性名:( 这是完全可能的,使用我使用的确切语法-你只需要能够拼写 我似乎无法实现这一点,而且这似乎是一个足够常见的场景,必须有一个解决方案,但我没有任何运气使用正确的术语来获得一个有用的谷歌结果 我想这样做: u = User.first u.clients.find_or_create_by_email('example@example.com') 其效果是使用user\u id=u.id创建一个新的客户端 我能通过有很多关系的人找到好的动态搜索者吗?如果不能,为什么

别介意,我已经查到了属性名:(


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


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

我想这样做:

u = User.first
u.clients.find_or_create_by_email('example@example.com')
其效果是使用
user\u id=u.id
创建一个新的
客户端

我能通过
有很多关系的人找到好的动态搜索者吗?如果不能,为什么

谢谢
:)

u = User.first
u.clients.find_or_create_by_email('example@example.com')
如果您有多个关系集,则可以使用。但是,如果在客户端对象上设置了任何验证,它不会引发验证错误,如果验证失败,它将自动失败

执行此操作时,可以在控制台中检查输出

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>
u.clients.通过电子邮件查找或创建example@example.com') # => #
将设置用户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">
u.clients.通过电子邮件和姓名查找或创建example@example.com“,“我的名字”)#=>#

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