In einer verschachtelten Form möchte ich, dass der Benutzer alle Parent
Childs
auf einmal erstellen oder ändern kann. Also lasst uns so die params, die so geführt werden, sind:Schienen, wie Eindeutigkeit über untergeordnete Objekte mit geschachteltem Formular überprüft wird
{"childs_attributes" => [{attribute:1}, {attribute:2}, {attribute:3}...]}
Ich würde eine Validierung mag, die für jeden einzelnen Parent
, die attribute
s aller seiner sagt Childs
muss eindeutig sein. Mit anderen Worten, in dem obigen Beispiel, das ist in Ordnung, weil Sie bekommen würden:
Parent.childs.pluck(:attribute).uniq.length == Parent.childs.pluck(:attribute).length
Wenn jedoch die params wie unten vergangen waren, es wäre ein Verstoß gegen die Gültigkeitsregel:
{"childs_attributes" => [{attribute:1}, {attribute:2}, {attribute:3}...]}
Bis jetzt ist die einzige Lösung, die ich für diese Validierung gefunden habe, im Controller ... was ich weiß, ist eine schlechte Übung, weil wir das zum Modell bringen wollen.
Das Problem ist, dass, wenn in dem Modell, das ich so etwas wie die unten habe:
class Parent
validate :unique_attribute_on_child
def unique_attribute_on_child
attribute_list = self.childs.pluck(:attribute)
if attribute_list.uniq.length != attribute_list.length
errors[:base] << "Parent contains Child(s) with same Attribute"
end
end
end
Das wird nicht funktionieren, weil self.childs.pluck(:attribute)
nicht die attribute
im aktuellen Update vergangen zurückkehren, da das aktuelle Update gewonnen Ich habe noch nicht gespeichert.
Ich denke, ich könnte etwas wie eine after_save
tun, aber das fühlt sich wirklich verworren, da es db zurückgeht und rückgängig macht (nicht zu erwähnen, der Code wie unten geschrieben [nicht getestet, nur ein Beispiel] führt wahrscheinlich zu einer kreisförmigen Schleife wenn ich nicht vorsichtig bin, da Parent zugehörige Kinder validieren)
Andere Ideen?