假设我打开一个Rails(2.3.8)脚本控制台并试试这个:
a = Account.new(:first_name) = 'foo'
i = a.invoices.build
p i.account.first_name
Account.rb是一个模型对象,包含: has_many:发票
和Invoice.rb是一个模型,包含: belongs_to:account,:validate =>真
在上面的控制台第3行中,i.account为零。我意识到如果帐户已保存,i.account将不会为零,但我不想保存帐户,除非我可以为帐户创建有效的发票。而且,只是为了踢,发票验证取决于未保存帐户的某些属性。
任何想法如何使这项工作?
最佳, 将
答案 0 :(得分:0)
我通常使用交易执行此操作。使用rails事务,您可以执行db交互并在任何时候无法验证时将其回滚。例如: 在你的模型中:
def save_and_create_invoice
Account.transaction do
#first let's save the account, this will give us an account_id to work with
return false unless self.save
invoice = self.invoices.build
#setup your invoice here and then save it
if invoice.save
#nothing wrong? return true so we know it was ok
return true
else
#add the errors so we know what happened
invoice.errors.full_messages.each{|err| errors.add_to_base(err)}
#rollback the db transaction so the account isn't saved
raise ActiveRecord::Rollback
#return false so we know it failed
return false
end
end
end
在您的控制器中,您可以这样称呼它:
def create
@account = Account.new(params[:account])
respond_to do |format|
if @account.save_and_create_invoice
format.html
else
format.html {render :action => "new"}
end
end
end
请注意,我没有运行此代码来测试它,只是快速地将其快速显示出来。