Pregunta

No me hagas caso, arruiné los nombres de mis atributos :(

Esto es completamente posible, usando la sintaxis exacta que usé: ¡solo necesitas poder deletrear!


Parece que no puedo hacer que esto funcione, y parece un escenario bastante común que debe haber una solución, pero no tengo suerte con la terminología correcta para obtener un resultado útil en Google.

Quiero hacer esto:

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

Con el efecto de que una nueva Client se crea con user_id = u.id.

¿Puedo obtener los bonitos buscadores dinámicos a través de un has_many ¿relación?Si no, ¿por qué?

Gracias :)

¿Fue útil?

Solución 2

Esto es completamente posible, usando la sintaxis exacta que usé: ¡solo necesitas poder deletrear!

Otros consejos

Este

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

funciona si usted tiene conjunto de relaciones has_many. Sin embargo, no va a aumentar error de validación si tiene alguna validaciones establecidas en el objeto cliente y se producirá un error en silencio si falla la validación.

Puede comprobar la salida en la consola cuando lo hace

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>

y el user_id se establecerá pero no el ID de cliente, ya que la validación ha fallado y el cliente no está creado

Así que esto debe crear el cliente sólo si pasa todos los atributos necesarios de objetos de cliente y la validación de objeto cliente ha superado con éxito.

Así que vamos a decir que su modelo cliente tiene la validación de nombre, así, aparte de correo electrónico a continuación, usted debe hacer

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">
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top