创建关联模型的最佳实践是什么?例如,如果其中一个验证失败(例如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
编辑:您可以选择在B
和C
模型中使用validates_associated
,如下所示:
class B < ActiveRecord::Base
belongs_to :A
validates_associated :A
end
class C < ActiveRecord::Base
belongs_to :A
validates_associated :A
end
这样,它将确保在创建B
或C
的记录之前存在相关的A
。
但是要注意,不能在两个关联(has_many
和belongs_to
)中都使用validates_associated
,因为这会导致无限递归。
您可以做的一件事是使用rails事务,并使用bang!版本的save!/create!
ActiveRecord::Base.transaction do
A.create!(aparams)
B.create!(bparams)
C.create!(cparams)
end