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

时间:2015-08-17 00:26:48

标签: ruby-on-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

基本上,我想创建许多相互依赖的模型,并希望在单个验证失败时保存所有这些模型或者不保存。我可以通过某种方式或其他方式来做,但想知道最好的方法。

2 个答案:

答案 0 :(得分:1)

您可以使用ActiveRecord验证的validates_associated方法来实现您的目的:

class A < ActiveRecord::Base
 has_many :B
 has_many :C

 validates_associated :B, :C
end

编辑:

您也可以在validates_associatedB模型中使用C,如下所示:

class B < ActiveRecord::Base
 belongs_to :A

 validates_associated :A
end

class C < ActiveRecord::Base
 belongs_to :A

 validates_associated :A
end

这样,它会确保在创建A的记录或B记录之前存在关联的C

但请注意,您不能在两个关联(validates_associatedhas_many)中使用belongs_to,因为这会导致无限递归。

答案 1 :(得分:1)

你可以做的一件事是使用rails transaction,并使用爆炸!版本的保存!/创建!

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