¿Puedo aplicar buscadores dinámicos basados en atributos a un objeto?
-
19-09-2019 - |
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 :)
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">