Могу ли я получить доступ к информации из одного связанного объекта AR в другом, когда оба не сохранены? - PullRequest
0 голосов
/ 30 августа 2010

Скажем, я открываю консоль сценариев 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 также является моделью, содержащей: own_to: account,: validate => true

В строке консоли 3 выше значение i.account равно nil. Я понимаю, что i.account не будет равен нулю, если учетная запись была сохранена, но я не хочу сохранять учетную запись, если не смогу создать действительный счет для этой учетной записи. И только для ударов проверка счета зависит от некоторых свойств несохраненного аккаунта.

Есть идеи, как заставить это работать?

Лучший, Будет

1 Ответ

0 голосов
/ 31 августа 2010

Я обычно делаю это с транзакциями. С помощью транзакций rails вы можете выполнять взаимодействия с БД и откатывать их в любое время, если что-то не удалось проверить. Например: в вашей модели:

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

Обратите внимание, что я не запускал этот код для тестирования, я просто быстро вынул его, чтобы показать пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...