Can I escopo dinâmico localizadores para um objeto atributo com base em?
-
19-09-2019 - |
Pergunta
Não me importa, eu fricked meus nomes de atributos: (
Este é inteiramente possível, usando a sintaxe exata que eu usei - você só precisa ser capaz de soletrar
Eu não consigo chegar a este trabalho, e parece que um cenário bastante comum que deve haver uma solução, mas eu não estou tendo nenhuma sorte com a terminologia correta para obter um resultado útil Google.
Eu quero fazer isso:
u = User.first
u.clients.find_or_create_by_email('example@example.com')
Com o efeito que uma nova Client
é criado com user_id = u.id
.
Posso obter as agradáveis ??finders dinâmicos através de uma relação has_many
? Se não, por quê?
Graças :)
Solução 2
Este é inteiramente possível, usando a sintaxe exata que eu usei - você só precisa ser capaz de soletrar
Outras dicas
Este
u = User.first
u.clients.find_or_create_by_email('example@example.com')
funciona se você tiver has_many relacionamento set. No entanto, ele não vai aumentar erro de validação se você tiver quaisquer validações definidas em seu objeto Cliente e vai falhar silenciosamente se a validação falhar.
Você pode verificar a saída em seu console quando você faz
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>
eo user_id será definido, mas não o id do cliente porque a validação falhou eo cliente não é criado
Portanto, este deve criar o cliente só se você passar todos os atributos necessários de objeto cliente e a validação para o objeto cliente passou com sucesso.
Então, digamos que seu modelo cliente tem de validação em nome bem além do e-mail, então você deve fazer
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">