Can I Umfang dynamischer attributbasierte Finders auf ein Objekt?
-
19-09-2019 - |
Frage
Stört mich nicht, fricked ich meine Attributnamen auf: (
Dies ist durchaus möglich, die genaue Syntax habe ich - Sie müssen nur in der Lage sein, zu buchstabieren
Ich kann nicht scheine dies zu Arbeit zu bekommen, und es scheint, wie ein gemeinsames genug Szenario, dass es eine Lösung sein muss, aber ich habe kein Glück mit der richtigen Terminologie ein hilfreiche Google Ergebnis zu erhalten.
Ich möchte, dies zu tun:
u = User.first
u.clients.find_or_create_by_email('example@example.com')
Mit dem Effekt, dass ein neues Client
mit user_id = u.id
erstellt wird.
Kann ich die schönen dynamischen Findern durch eine has_many
Beziehung bekommen? Wenn nicht, warum?
Danke :)
Lösung 2
Dies ist durchaus möglich, die genaue Syntax habe ich - Sie müssen nur in der Lage sein, zu buchstabieren
Andere Tipps
Das
u = User.first
u.clients.find_or_create_by_email('example@example.com')
funktioniert, wenn Sie has_many Beziehung gesetzt haben. Es wird jedoch nicht Validierungsfehler erhöhen, wenn Sie irgendwelche Validierungen haben setzen auf Ihrem Client-Objekt, und es wird stillschweigend fehl, wenn die Überprüfung fehlschlägt.
Sie können die Ausgabe in der Konsole überprüfen, wenn Sie tun
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>
und die user_id eingestellt werden, aber nicht die ID des Client, da die Validierung fehlgeschlagen ist und der Kunde wird nicht erstellt
Also das den Client erstellen sollte nur, wenn Sie alle erforderlichen Attribute von Client-Objekt und die Validierung für die Client-Objekt übergeben erfolgreich bestanden hat.
So kann sagen, Ihr Client-Modell als auch auseinander Validierung auf dem Namen von E-Mail hat, dann sollten Sie tun
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">