在rails中创建相互依赖的关联模型——最佳实践



创建关联模型的最佳实践是什么?例如,如果其中一个验证失败(例如C),我不想保存任何东西。此外,如果有的话,显示每个模型的错误。

class A
 has_many :B
 has_many :C
end
class B
end
class C
end
class AController
  def create
    afields = params[:a_params]
    bfields = params[:b_params]
    cfields = params[:c_params]
    a = A.new(a_params)
    if a.save
      B.create(bfields)
      C.create(cfields)
      redirect_to a_index
    else
      redirect_to a_new_path
    end   
  end
end

基本上,我想创建很多相互依赖的模型,并希望在单个验证失败时保存所有模型或不保存模型。我可以这样做,但我想知道最好的方法。

您可以使用ActiveRecord验证的validates_associated方法来达到您的目的:

class A < ActiveRecord::Base
 has_many :B
 has_many :C
 validates_associated :B, :C
end
编辑:

您可以选择在BC模型中使用validates_associated,如下所示:

class B < ActiveRecord::Base
 belongs_to :A
 validates_associated :A
end
class C < ActiveRecord::Base
 belongs_to :A
 validates_associated :A
end

这样,它将确保在创建BC的记录之前存在相关的A

但是要注意,不能在两个关联(has_manybelongs_to)中都使用validates_associated,因为这会导致无限递归。

您可以做的一件事是使用rails事务,并使用bang!版本的save!/create!

ActiveRecord::Base.transaction do
  A.create!(aparams)
  B.create!(bparams)
  C.create!(cparams)
end

相关内容

  • 没有找到相关文章

最新更新