after_save does not work consecutively

Rails 3.1.3

Related to my old thread

video.rb has

  after_save :create_first_script   private   def create_first_script     @script = Script.new(:video_id => self.id, :startp => 0, :text => 'ToDo: ')     @script.save   end

The problem is that after destroying all data, a freshly created video DOES create the first Script, but the following videos DO NOT.

I have added User table so that Video and Script classes are only editable for Users that own them. The association is

User:1 -- n:Video:1--n:Script

To be honest, I have no idea which part of my code is causing this problem. I am sure the information provided here is not enough. I appreciate if you point out what I need to show you in order to gain some help.

Thanks in advance.

soichi

Do know why fresh created video can create script but following video does not. What i am 100% sure is that after_save is not right place to put this logic. Cause any object’s update will invoke after save, so new script will created every update.

Looking at the log... The first one is successful in creating the first Script, the second one is not. SQL is not working for the second but certainly after_save method is called..('first script action HERE!!!!!!' is logger.info).

Does it help?

soichi

Started POST "/videos" for 127.0.0.1 at 2012-03-16 14:08:42 +0900   Processing by VideosController#create as HTML   Parameters: {"utf8"=>"✓", "authenticity_token"=>"/AYk7ocjjteBKH8fDpQZ7FKzme/0nSsT2kalq8FgI18=", "video"=>{"title"=>"Rush Limbaugh Calls a Female Georgetown Student, Sandra Fluke, a 'Slut'", "url"=>"- YouTube, "language"=>"1", "genre"=>"news"}, "commit"=>"Create Video"}   User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1   SQL (0.7ms) INSERT INTO "videos" ("created_at", "genre", "language", "title", "updated_at", "url", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?) [["created_at", Fri, 16 Mar 2012 14:08:43 JST +09:00], ["genre", "news"], ["language", "1"], ["title", "Rush Limbaugh Calls a Female Georgetown Student, Sandra Fluke, a 'Slut'"], ["updated_at", Fri, 16 Mar 2012 14:08:43 JST +09:00], ["url", "- YouTube], ["user_id", 1]] first script action HERE!!!!!!    (0.2ms) SELECT 1 FROM "scripts" WHERE "scripts"."startp" = 0.0 LIMIT 1   SQL (0.5ms) INSERT INTO "scripts" ("created_at", "startp", "text", "updated_at", "video_id") VALUES (?, ?, ?, ?, ?) [["created_at", Fri, 16 Mar 2012 14:08:43 JST +09:00], ["startp", #<BigDecimal:102b7cd18,'0.0',9(36)>], ["text", "ToDo: "], ["updated_at", Fri, 16 Mar 2012 14:08:43 JST +09:00], ["video_id", 11]] Redirected to http://localhost:3001/videos/11 Completed 302 Found in 211ms

Started POST "/videos" for 127.0.0.1 at 2012-03-16 14:08:59 +0900   Processing by VideosController#create as HTML   Parameters: {"utf8"=>"✓", "authenticity_token"=>"/AYk7ocjjteBKH8fDpQZ7FKzme/0nSsT2kalq8FgI18=", "video"=>{"title"=>"bergman trailer persona", "url"=>"bergman trailer persona - YouTube, "language"=>"1", "genre"=>"persona"}, "commit"=>"Create Video"}   User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1   SQL (0.7ms) INSERT INTO "videos" ("created_at", "genre", "language", "title", "updated_at", "url", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?) [["created_at", Fri, 16 Mar 2012 14:09:00 JST +09:00], ["genre", "persona"], ["language", "1"], ["title", "bergman trailer persona"], ["updated_at", Fri, 16 Mar 2012 14:09:00 JST +09:00], ["url", "bergman trailer persona - YouTube], ["user_id", 1]] first script action HERE!!!!!!    (0.2ms) SELECT 1 FROM "scripts" WHERE "scripts"."startp" = 0.0 LIMIT 1 Redirected to http://localhost:3001/videos/12 Completed 302 Found in 207ms

did not quite look into it. But i strongly suspect this

"(0.2ms) SELECT 1 FROM “scripts” WHERE “scripts”.“startp” = 0.0 LIMIT

1"

This will return true/1 in any condition.

I found the mistake in my code.

I have put one of the fields of Script, startp, to become ":uniquness => true".

I didn't know that it is effective for all sets of Script instances that belong to a single Video.

Anyway, thanks for your answers.

soichi