两者都未保存时,是否可以从另一个关联的AR对象访问信息?

时间:2010-08-30 18:28:47

标签: ruby-on-rails activerecord

假设我打开一个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将不会为零,但我不想保存帐户,除非我可以为帐户创建有效的发票。而且,只是为了踢,发票验证取决于未保存帐户的某些属性。

任何想法如何使这项工作?

最佳, 将

1 个答案:

答案 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

请注意,我没有运行此代码来测试它,只是快速地将其快速显示出来。