1

我已经通过其他问题计数,但情况是有点不同的位置:验证为Rails中的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对象,这可能会导致它,但为此,我在验证中使用size而不是count

+0

如果你把'如果self.documents.size> 2'为'如果self.documents.size> 1 ',它将停止为同一用户创建第三个文档。 user'在'document.rb':用户validate方法'Document'创建 – kiddorails

+0

你试过把'validates_associated前触发? – Pavan

+0

@Pavan'validates_associated:user'不会 '在'Document'工作多态性'附'。 'user'将会是未定义的。 – kiddorails

回答

2

inverse_of在这里再次营救。

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

user.documents << Document.new(file: file)不会改变计数的用户的相关文档,除非实际创建的文档,并且因为计数将保持2在创建第三文件,所以Rails会不会阻止你创造与用户关联的第三个文档,导致验证的目的失效。

那么下面就是我所做的:

# 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

您可以使用标准的验证这一点,而不是一个自定义:

validates :documents, length: { maximum: 2 } 

你总是可以在一个事务中把这个包,虽然我是没有正确回滚有点惊讶如果文件最终无效,则保存文件。

+0

我也试过这个,但它不起作用。 –