1

레일에서 has_many 관계의 수에 대한 검증,하지만 시나리오가 여기에 약간 다릅니다 : 지금내가 다른 질문을 통해되었습니다

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 

가 이미 두 문서를 가지고 그 User.find(2)을 고려 그래서 다음을 수행 :

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

성공적으로 문서를 만들고 첨부 파일의 유효성을 검사하지 않습니다 : User. 데이터베이스에 문서가 생성 된 후 user & Document.last은 유효하지 않지만 어떤 용도로 작성되었는지는 이제 확인되었습니다.

런타임에 Document 개체를 만들려고하는데 그 원인이있을 수 있지만 count 대신 size을 사용하고 있습니다. 내가 제대로 다시 굴러되지 조금 놀랐어요하지만,

validates :documents, length: { maximum: 2 } 

당신은 항상 트랜잭션이 랩 수 :

+0

self.documents.size 경우'할 경우> 2''에 self.documents.size> 한 경우 '을 선택하면 같은 사용자에 대한 세 번째 문서 작성이 중단됩니다. 'Document'가 생성되기 전에 사용자를위한 validate 메소드가 실행됩니다. – kiddorails

+0

'validates_associated : user'를'document.rb'에 넣으려고 했습니까? – Pavan

+0

@Pavan'validates_associated : 사용자는'Document'에서 다형성'attachable '을 위해 일하지 않을 것입니다. 'user'는 정의되지 않습니다. – kiddorails

답변

2

inverse_of 다시 이곳에서 구하십시오.

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

제 3 문서를 작성하는 동안 카운트가 2로 유지됩니다, 그래서 레일 작성을 멈추지 않을 것 때문에 문서가 실제로 생성되지 않는 사용자의 관련 문서의 수를 변경하지 않습니다 user.documents << Document.new(file: file)을하는 사용자와 관련된 세 번째 문서로, 유효성 확인을위한 목적을 없앱니다. 그래서 다음

내가 무슨 짓을 :

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

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

관련 기사 읽기 : https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through

0

당신은 오히려 사용자 정의 하나보다, 이것에 대한 표준 검증을 사용할 수 있습니다 문서가 유효하지 않으면 저장하십시오.

+0

나는 이것도 시도했지만 작동하지 않습니다. –