Rails Validierung für eine has_many-Assoziation
Ich bin Probleme mit Validierungen auf einer has_many-Beziehung, bei der die Kinder vorhanden, aber die Eltern nicht. Jedoch beim erstellen/speichern des übergeordneten Objekts, möchte ich sicherstellen, dass bestimmte Kinder (mit bestimmten Parametern) bereits gespeichert wurden.
Es ist ein Parent
Objekt, das has_many
Child
Objekte. Die Child
Objekte sind persistent in die Datenbank erste, und damit haben keine Referenz auf das übergeordnete Element. Die Vereins-Struktur:
Parent
- has_many :children
Child
- someProperty: string
- belongs_to: parent
Gibt es zum Beispiel drei Kind-Objekte:
#1 {someProperty: "bookmark", parent: nil}
#2 {someProperty: "history", parent: nil }
#2 {someProperty: "window", parent: nil }
Eines Elternteils ist nur dann gültig, wenn es enthält die untergeordneten Objekte mit someProperty history
und window
.
Ich bin einrichten die Eltern in der Steuerung als:
p = Parent.new(params[:data])
for type in %w[bookmark_id history_id window_id]
if !params[type].blank?
p.children << Child.find(params[type])
end
end
//save the parent object p now
p.save!
Wenn die Kinder zugeordnet sind, die Eltern mit <<
Sie werden nicht sofort gespeichert wie die Eltern-id ist nicht vorhanden. Und für die Eltern, um gerettet zu werden, es müssen mindestens diese 2 Kinder. Wie könnte ich dieses problem lösen? Jeder input ist willkommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht sicher, warum Sie brauchen, um so etwas zu tun, aber trotzdem, wie Sie über das tun dies?
Controller:
Wie Sie sehen können, ich zog alle Logik-Modell auf den ersten Platz. Dann, es ist ein zwei-Schritt-Prozess, der für die Rettung der Kinder. Zuerst weisen wir die Kinder zu den Eltern und dann werden wir überprüfen, ob Sie die erforderlichen Kriterien erfüllen (fügen Sie Ihre Logik).
Sorry für die kurzen. Ich beantworte dir weitere Fragen, wenn nötig.
Erste Sache, die, wenn Sie will, dass die Kinder gerettet werden, ohne die Eltern-id, dann gibt es keinen Sinn, dies zu tun
ist der ganze Zweck des
ist, befestigen Sie die Eltern-id für das untergeordnete Objekt, das Sie nicht hier machen, weil die Eltern noch nicht vorhanden.
Die andere Sache ist, wenn Sie nur wollen, um sicherzustellen, dass der Elternteil hat ein Kind-Objekt und wenn Sie Kind und Eltern zusammen, dann können Sie mit der Transaktion block, um die übergeordneten und untergeordneten Schöpfung, die sicherstellen wird, dass die Eltern Kind, wie
So, in der Transaktion, wenn zu irgendeinem Zeitpunkt-code, fehlschlägt, wird ein rollback für die gesamte db-Transaktion , ich.e Sie haben entweder ein Elternteil mit 2 Kindern oder gar nichts, wenn das der Endzustand, die Sie suchen.
EDIT: Da kann man nicht erstellen, ein Elternteil, es sei denn, Sie hat 2 Kinder, in diesem Fall, statt
tun
Macht das Sinn