2017-05-16 5 views
0

Ich habe eine Einheit: book der Klasse Buch.Schienen gesetzt has_many Wert dynamisch

Die Entitätsklasse hat has_many Beziehung mit anderen Tabellen, pages zum Beispiel.

Nehmen wir an, dass page_1 und page_2 gültige Werte sind, die ich speichern möchte. Die nicht-dynamische Version wäre etwas wie:

entity.pages = [page_1, page_2] 

Wie kann ich das dynamisch einstellen?

ich versuchte, mit send ohne Glück (was für has_one gut funktioniert):

attr = :pages # my dynamic attribute 

book.send(attr) = [page_1, page_2] 
# SyntaxError: unexpected '=', expecting end-of-input 
# mc.send(:diagnoses, '=') = [s] 
#       ^

Wenn ich << verwenden scheint es zu funktionieren:

book.send(attr) << page_1 

aber das Problem ist, dass ich brauche, um Löschen unterstützen, z wenn das Buch page3 hatte und jetzt page1 und page2.

Ich möchte nicht eval verwenden, sowohl wegen der Leistung und Sicherheit. Nicht sicher, dass es verwandt ist, aber diese dynamischen Attribute haben alle die gleiche Klasse - hat viele mit einer dynamischen Bedingung.

+1

hast du versucht 'book.public_send (" # {attr} = ", [page_1, page_2])'? – okliv

Antwort

2

Das richtige Format ist der Aufruf der Setter (Zuweisungs-) Methode. Dies ist normalerweise das Attribut, dem ein Gleichheitszeichen folgt. In Ihrem Fall sollten Sie pages=

book.send(attr.to_s + '=', [page_1, page_2]) 

Entspricht

book.send('pages=', [page_1, page_2]) 

das ist ...

book.pages=([page_1, page_2]) 

oder mehr konventionell

book.pages = [page_1, page_2] 
0

book.association(:pages).target Versuchen geschrieben

+0

Willkommen bei Stack Overflow! Vielen Dank für dieses Code-Snippet, das sofortige Hilfe bieten kann. Eine richtige Erklärung [würde erheblich verbessern] (// meta.stackexchange.com/q/114762) ihren pädagogischen Wert, indem sie * warum * dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit ähnlichen, nützlicher machen würde, aber nicht identisch, Fragen. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung hinzuzufügen und geben Sie an, welche Einschränkungen und Annahmen gelten. –

Verwandte Themen