为例如创建相关模型的最佳做法是什么?如果其中一个验证失败(比如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
基本上,我想创建许多相互依赖的模型,并希望在单个验证失败时保存所有这些模型或者不保存。我可以通过某种方式或其他方式来做,但想知道最好的方法。
答案 0 :(得分:1)
您可以使用ActiveRecord验证的validates_associated
方法来实现您的目的:
class A < ActiveRecord::Base
has_many :B
has_many :C
validates_associated :B, :C
end
您也可以在validates_associated
和B
模型中使用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_associated
和has_many
)中使用belongs_to
,因为这会导致无限递归。
答案 1 :(得分:1)
你可以做的一件事是使用rails transaction,并使用爆炸!版本的保存!/创建!
ActiveRecord::Base.transaction do
A.create!(aparams)
B.create!(bparams)
C.create!(cparams)
end