验证Rails中has_many关系的计数

时间:2017-09-11 01:41:58

标签: ruby-on-rails rails-activerecord polymorphic-associations

我遇到了其他问题,但这里的情况略有不同:

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和&amp; Document.last无效,但有什么用途,现在已经创建了。

我尝试在运行时创建一个Document对象,这可能会导致它,但为此目的,我使用的是size而不是{{} 1}}在我的验证中。

2 个答案:

答案 0 :(得分:2)

cluster.setContactPoints(<cassandra_server_ip>); 再次在这里营救。

inverse_of

执行user = User.find(1) # This user has already 2 associated documents. 不会更改用户关联文档的计数,除非实际创建文档,并且因为在创建第三个文档时计数将保持为2,所以Rails赢得了#3;停止创建与用户关联的第三个文档,从而扼杀了验证的目的。

以下是我的所作所为:

user.documents << Document.new(file: file)

相关文章:https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through

答案 1 :(得分:0)

您可以使用标准验证,而不是自定义验证:

validates :documents, length: { maximum: 2 }

你总是可以将它包装在一个事务中,虽然我有点意外的是,如果它没有最终有效,它就不能正确地回滚Document。