Ruby on rails 有没有一种方法可以延迟持久化has\u many:通过关联直到保存主对象?

Ruby on rails 有没有一种方法可以延迟持久化has\u many:通过关联直到保存主对象?,ruby-on-rails,rails-activerecord,has-many-through,ruby-on-rails-4.1,Ruby On Rails,Rails Activerecord,Has Many Through,Ruby On Rails 4.1,我有一个模型,在我想保存模型之前,需要根据has\u many:through关联验证可访问性。大概是这样的: class Document < ActiveRecord::Base belongs_to :organization has_many :category_documents has_many :categories, through: :category_documents validate :categories_are_accessible_to_or

我有一个模型,在我想保存模型之前,需要根据
has\u many:through
关联验证可访问性。大概是这样的:

class Document < ActiveRecord::Base
  belongs_to :organization
  has_many :category_documents
  has_many :categories, through: :category_documents

  validate :categories_are_accessible_to_organization

  private
    def categories_are_accessible_to_organization
      if (organization.category_ids & category_ids) != category_ids
        errors.add(:categories, "not accessible to the parent organization")
      end
    end
end
class文档

在新唱片上,似乎没有问题。但是,对于持久化记录,如果验证失败,则更新期间添加的类别将持久化。有没有办法推迟这些连接模型的持久性,直到
文档
对象通过验证并通过任何内置机制保存?

要检查关联的验证,可以使用
验证\u关联的:类别
,从


要检查
文档的有效性
,请在更新操作中的
文档\u controller.rb
中执行以下操作:

def update
  @document.attributes = document_params

  respond_to do |format|
    if @document.valid? && @document.update(document_params)
      format.html { redirect_to documents_path, notice: 'Document was successfully updated.' }
    else
      format.html { render action: 'edit' }
    end
  end
end

我的想法是,您使用active record在保存任何关联对象之前检查验证。

您可以通过将验证移动到连接模型(即,
CategoryDocument
)来实现相同的目标,类似这样

class CategoryDocument < ActiveRecord::Base
   belongs_to :category
   belongs_to :document

   before_save do
     false unless document.organization.category_ids.include?(category.id)
   end
end
class CategoryDocument
这将使这样的操作失败

Document.first.categories << category_that_does_not_satisfy_validation # raises ActiveRecord::RecordNotSaved

Document.first.categories问题不在于关联对象是否有效。这取决于关联集是否有效,以便在给定另一个关联时进行关联。我确实尝试在连接模型上放置
验证与之关联的
,但无论状态如何,它都会引发错误。问题是,关联HMT的分配在持久化对象分配后立即进行,无论是使用
#attributes=
还是
#update
。这与在联接模型上添加
验证关联的
非常接近。这里的问题是,它仍然试图立即创建它们,这会导致出现错误,其余的赋值也会失败。即使其他参数允许,验证也不会通过,因为错误会立即引发。我需要完全推迟关联的保存/验证,直到验证和保存所有者。哪里是拯救错误的合适地点?控制器将是我从错误中拯救出来的选择。除此之外,我找不到一种方法来推迟持久性而不进行一些丑陋的元编程,对不起:(。