0

In einer verschachtelten Form möchte ich, dass der Benutzer alle ParentChilds 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?

Antwort

0

Mein erster Impuls ist es, vorzuschlagen, dass Rails intelligente Pluralisierung verwendet und versuchen, children anstelle von childs zu verwenden, aber ich denke, das war nur das Beispiel.

Ich empfehle jetzt, dass Sie Ihre Strategie ändern. Rufen Sie die Validierung für die Kinder so auf:

class Child < ActiveRecord::Base 
    belongs_to :parent 
    ... 
    validates :child_attribute, uniqueness: { scope: :parent } 
    ... 
end