Jan Roesner schrieb:
Hallo Gruppe,

ich werde aus der 2006'er Ausgabe der Bibel nicht ganz schlau wenn es
um transactions geht. Ich habe Models, die in keiner Beziehung
stehen, unter bestimmten Umständen aber doch in einer Transaktion
gespeichert werden müssen.

def create @bid = Bid.new(session[:temp_bid]) if @bid.valid? if
@bid.save if @bid.create_bid_transaction @shipping.bidcount += 1 if
@shipping.save @message = Message.new() @message.bla = blu if not
@message.save redirect_to :controller => "error", :action => "error_message" end if @settings = Setting.find(:first, :conditions
=> ["user_id = ?", session[:user_id]]) @settings.foo = bar if not
@settings.save redirect_to :controller => "error", :action => "error_settingsa" end end end else redirect_to :controller =>
"error", :action => "error_bid" end else redirect_to :controller =>
"error", :action => "error_validate_bid" end end

Das spannende hierbei ist, dass hier schon 4 Tables bids, shippings,
messages und settings beteiligt sind, aber in der Funktion
create_bid_transaction nochmal 2 weitere Tables betroffen sind.

David spricht jetzt zwar von "Multidatabase Transaction" und
schreibt:

User.transaction(user) do Account.transaction(account) do account.calculate_fees user.date_fees_last_calculated = Time.now user.save account.save end end

Aber meint hier doch eher "Multitable Transactions", oder?

Ich weiss, dass der Code oben übel ist,

Jaaa, insbesondere das

Setting.find(:first, :conditions => ["user_id = ?", session[:user_id]])

-->

current_user.settings.find(:first)

oder

if @bid.valid?
      if @bid.save
        if @bid.create_bid_transaction

Das kann in eine Methode oder zumindest valid/save zusammenfassen (save ruft valid? auf).


aber abgesehen davon die
Frage: Muss ich meine Transaktionen nun für jedes der verwendeten
Models schachteln, um hier Transaktionssicherheit zu haben?

Nein, IMHO tut es ein

User.transaction do
  User.destroy(1)
  Account.create!(:foo => 'bar')
  Setting.update_all('foo=bar', 'bar=foo')
end

Die alte, jetzt nicht mehr gültige Schreibweise transaction(object) hat die Object-level Transactions geboten.

Jonathan

--
Jonathan Weiss
http://blog.innerewut.de
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Antwort per Email an