1

ich durch andere Fragen gewesen sein, aber das Szenario ist etwas anders hier:Validierung für die Zählung von has_many Beziehung in Rails

class User < ApplicationRecord 
    has_many :documents, as: :attachable 

    validate :validate_no_of_documents 

    private 
    def validate_no_of_documents 
    errors.add(:documents, "count shouldn't be more than 2") if self.documents.size > 2 
    end 
end 


class Document < ApplicationRecord 
    belongs_to :attachable, polymorphic: true 

    validates_associated :attachable 
end 

Nun User.find(2) berücksichtigen, dass bereits zwei Dokumente hat, dabei die folgende:

user.documents << Document.new(file: File.open('image.jpg', 'rb')) 

Dies erstellt erfolgreich das Dokument und validiert nicht die anfügbar: User. Nachdem das Dokument in der Datenbank erstellt wurde, sind beide user & Document.last ungültig, aber welche Verwendung, sie wurden jetzt erstellt.

Ich versuche, ein Document Objekt zur Laufzeit zu erstellen, und das kann verursachen, aber zu diesem Zweck verwende ich size anstelle von count in meiner Validierung.

+0

, wenn Sie 'wenn self.documents.size machen> 2' zu' wenn self.documents.size> 1 ', es wird aufhören, ein drittes Dokument für denselben Benutzer zu erstellen. Die Validierungsmethode für den Benutzer wird ausgelöst, bevor das Dokument erstellt wird – kiddorails

+0

Haben Sie versucht, 'validates_associated: user' in' document.rb' zu setzen? – Pavan

+0

@Pavan 'validates_associated: Benutzer' arbeitet nicht in 'Document' für polymorphe' Attachable'. 'user' ist nicht definiert. – kiddorails

Antwort

2

inverse_of hier wieder zu retten.

user = User.find(1) # This user has already 2 associated documents. 

Doing user.documents << Document.new(file: file) nicht die Zählung für die zugehörigen Dokumente eines Benutzers ändern, es sei denn ein Dokument tatsächlich erstellt wird, und da die Zählung 2 bleiben, während ein drittes Dokument zu erstellen, so Rails werden Sie nicht aufhören zu schaffen ein drittes Dokument, das dem Benutzer zugeordnet ist und den eigentlichen Zweck der Validierung zunichte macht.

So finden Sie, was ich tat:

# In User model 
has_many :documents, as: :attachable, inverse_of: :attachable 

# In Document model 
belongs_to :attachable, polymorphic: true, inverse_of: :attachments 

Verwandte Artikel zu lesen: https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through

0

Sie können eine Standard-Validierung für diese verwenden, anstatt eine benutzerdefinierte ein:

validates :documents, length: { maximum: 2 } 

könnten Sie immer diese wickeln in einer Transaktion, obwohl ich ein wenig überrascht bin, ist es nicht richtig das Rollback Dokument speichern, wenn es nicht gültig ist.

+0

Ich habe das auch versucht, aber es funktioniert nicht. –

Verwandte Themen