Strange Active::Record behavior, StatementInvalid exception thrown twice?

Hi,

I'm a bit puzzled with an ActiveRecord::StatementInvalid exception that's apparently being thrown twice.

I'm using Rails 2.3.3 and Postgres, and inside the Feed Model I have something like:

has_many :entries, :dependent => :delete_all

def process_feed   ...   process_feed_entries   # log saving feed   save! # will fail if an exception is thrown below end

def process_feed_entries   ...   begin     # log saving entry     entry.save! # can fail because of duplicate key values   rescue ActiveRecord::StatementInvalid => e     # log exception caught     # log the error in the db (Log Model)   end end

DB log:

* Saving entry BEGIN PGError: ERROR: duplicate key value ... : INSERT INTO "entries" ... ROLLBACK * Exception caught BEGIN INSERT INTO "logs" ... COMMIT * Saving feed BEGIN UPDATE "feeds" ... PGError: ERROR: duplicate key value ... : INSERT INTO "entries" ROLLBACK ActiveRecord::StatementInvalid: PGError: ERROR: duplicate key ... Stack trace

The last exception that terminates execution was (or should have been) caught inside the begin/rescue block. Why is it thrown again when the feed is saved, if the transaction was rolled back?

Any hints much appreciated!

Thanks,

Nothing like explaining your problem to others :slight_smile:

I figure feed.save tries to save the associated entry and that throws the exception again.

I have to delete the offending entry inside the rescue clause.

Thanks,

Hi,

I'm a bit puzzled with an ActiveRecord::StatementInvalid exception that's apparently being thrown twice.

I'm using Rails 2.3.3 and Postgres, and inside the Feed Model I have something like:

has_many :entries, :dependent => :delete_all

def process_feed ... process_feed_entries # log saving feed save! # will fail if an exception is thrown below end

def process_feed_entries ... begin # log saving entry entry.save! # can fail because of duplicate key values

Is entry a member of the entries collection ? If so then the docs on associations state

"All unsaved (new_record? == true) members of the collection are automatically saved when the parent is saved." ie when you call feed.save! unsaved association members are saved.

Fred

Oops, you beat me to it !

Fred