Question about Rails behaviour

Hello,

Well I have a post and a post_picture model:

class Post < ActiveRecord::Base   has_one :post_picture end

class PostPicture < ActiveRecord::Base   belongs_to :post end

When a user creates a post he/she can upload a picture. So in the create action on the posts_controller I have the following:

def create     @post = Post.new(params[:post])     @post_picture = PostPicture.new(:uploaded_data => params[:post_picture_file])     @post.post_picture = @post_picture     if @post.save ... end

As you can see I relate the @post_picture with the @post using the line of code

"@post.post_picture = @post_picture"

My question is:

When I do the @post.save does rails treats this as a transaction? (I want to know because there is maybe possible data loss if the post is saved into the posts table and the post_picture is not saved into the post_pictures table or viceversa.

Thanks,

Elioncho

since post_picture should await post_id as a foreign key, post_picture will not be saved properly (or at least will not relate to the specified post) if post is not saved. as long as there aint no post.id (which is created while saving) you can't save the relation between these two objects.

i'd say it's best to save @post and after that create @post_picture and save it as well.

def create   @post = Post.new(params[:post])   if @post.save     @post_picture = PostPicture.new(:uploaded_data => params[:post_picture_file])     @post.post_picture = @post_picture     if @post_picture.save       # post and post_picture are saved correctly       # ...     else       # post_picture could not be saved (=> error handling)     end   else     # post could not be saved (=> error handling)   end end

Thanks for your reply. It was helpful.

Elioncho