On Sunday, February 4, 2018 at 6:25:46 PM UTC-5, Walter Lee Davis wrote:
>
> Even more interesting (to me, anyway) is what happens if you create (but 
> don't save) any of these objects: 
>
> 2.4.2 :006 > p = Person.new name: 'Walter' 
>  => #<Person id: nil, name: "Walter", created_at: nil, updated_at: nil> 
> 2.4.2 :007 > c = Picture.new file: 'some file' 
>  => #<Picture id: nil, file: "some file", created_at: nil, updated_at: 
> nil> 
> 2.4.2 :008 > p.pictures << c 
>  => #<ActiveRecord::Associations::CollectionProxy [#<Picture id: nil, 
> file: "some file", created_at: nil, updated_at: nil>]> 
> 2.4.2 :009 > p.save 
>    (1.9ms)  begin transaction 
>   SQL (23.1ms)  INSERT INTO "people" ("name", "created_at", "updated_at") 
> VALUES (?, ?, ?)  [["name", "Walter"], ["created_at", "2018-02-04 
> 23:23:15.342294"], ["updated_at", "2018-02-04 23:23:15.342294"]] 
>   SQL (0.3ms)  INSERT INTO "pictures" ("file", "created_at", "updated_at") 
> VALUES (?, ?, ?)  [["file", "some file"], ["created_at", "2018-02-04 
> 23:23:15.374862"], ["updated_at", "2018-02-04 23:23:15.374862"]] 
>   SQL (0.4ms)  INSERT INTO "person_pictures" ("person_id", "picture_id", 
> "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["person_id", 2], 
> ["picture_id", 2], ["created_at", "2018-02-04 23:23:15.376805"], 
> ["updated_at", "2018-02-04 23:23:15.376805"]] 
>    (1.3ms)  commit transaction 
>  => true 
> 2.4.2 :010 > 
>
> When you save one of them, all three are saved in order to preserve the 
> entire set of relationships. 
>
> Walter 
>
> > On Feb 4, 2018, at 4:54 PM, Walter Lee Davis <wa...@wdstudio.com 
> <javascript:>> wrote: 
> > 
> > I can't duplicate this finding here. Here's the console log: 
> > 
> > 2.4.2 :001 > p = Person.new name: 'Walter' 
> > => #<Person id: nil, name: "Walter", created_at: nil, updated_at: nil> 
> > 2.4.2 :002 > p.save 
> >   (0.2ms)  begin transaction 
> >  SQL (2.8ms)  INSERT INTO "people" ("name", "created_at", "updated_at") 
> VALUES (?, ?, ?)  [["name", "Walter"], ["created_at", "2018-02-04 
> 21:47:31.000973"], ["updated_at", "2018-02-04 21:47:31.000973"]] 
> >   (1.3ms)  commit transaction 
> > => true 
> > 2.4.2 :003 > c = Picture.new file: 'some file' 
> > => #<Picture id: nil, file: "some file", created_at: nil, updated_at: 
> nil> 
> > 2.4.2 :004 > c.save 
> >   (0.2ms)  begin transaction 
> >  SQL (2.2ms)  INSERT INTO "pictures" ("file", "created_at", 
> "updated_at") VALUES (?, ?, ?)  [["file", "some file"], ["created_at", 
> "2018-02-04 21:47:54.717609"], ["updated_at", "2018-02-04 
> 21:47:54.717609"]] 
> >   (1.4ms)  commit transaction 
> > => true 
> > 2.4.2 :005 > p.pictures << c 
> >   (0.1ms)  begin transaction 
> >  SQL (0.6ms)  INSERT INTO "person_pictures" ("person_id", "picture_id", 
> "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["person_id", 1], 
> ["picture_id", 1], ["created_at", "2018-02-04 21:47:58.847298"], 
> ["updated_at", "2018-02-04 21:47:58.847298"]] 
> >   (1.1ms)  commit transaction 
> >  Picture Load (0.4ms)  SELECT  "pictures".* FROM "pictures" INNER JOIN 
> "person_pictures" ON "pictures"."id" = "person_pictures"."picture_id" WHERE 
> "person_pictures"."person_id" = ? LIMIT ?  [["person_id", 1], ["LIMIT", 
> 11]] 
> > => #<ActiveRecord::Associations::CollectionProxy [#<Picture id: 1, file: 
> "some file", created_at: "2018-02-04 21:47:54", updated_at: "2018-02-04 
> 21:47:54">]> 
> > 2.4.2 :006 > 
> > 
> > Here's the models: 
> > 
> > class Picture < ApplicationRecord 
> >  has_many :person_pictures 
> >  has_many :people, through: :person_pictures 
> > end 
> > 
> > class Person < ApplicationRecord 
> >  has_many :person_pictures 
> >  has_many :pictures, through: :person_pictures 
> > end 
> > 
> > class PersonPicture < ApplicationRecord 
> >  belongs_to :person 
> >  belongs_to :picture 
> > end 
> > 
> > Whatever is happening on your app is not clear, but you can see that 
> after you save the person and the picture, when you add that saved picture 
> to the saved person's 'pictures' collection, the only record that gets 
> created is a person_picture. Now if either the person or the picture was in 
> the "new" state, that is to say, not saved yet, then I could imagine that 
> it would be saved by ActiveRecord first in order to allow the 
> person_picture record to be saved. Both IDs have to be known before the 
> join object can be saved. 
> > 
> > Walter 
> > 
> >> On Feb 4, 2018, at 2:30 PM, fugee ohu <fuge...@gmail.com <javascript:>> 
> wrote: 
> >> 
> >> In a has_many_through association where both records exist how do I 
> create a new association 
> >> In this case Person has_many_pictures through person_picture and I'm 
> trying to add an existing picture to an existing person like this: 
> >> @person.pictures << @picture 
> >> But this creates a new picture instead of adding the association 
> >> 
> >> 
> >> -- 
> >> You received this message because you are subscribed to the Google 
> Groups "Ruby on Rails: Talk" group. 
> >> To unsubscribe from this group and stop receiving emails from it, send 
> an email to rubyonrails-ta...@googlegroups.com <javascript:>. 
> >> To post to this group, send email to rubyonra...@googlegroups.com 
> <javascript:>. 
> >> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rubyonrails-talk/741e9a16-483f-4fc6-a2e7-77706b9b250c%40googlegroups.com.
>  
>
> >> For more options, visit https://groups.google.com/d/optout. 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups "Ruby on Rails: Talk" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an email to rubyonrails-ta...@googlegroups.com <javascript:>. 
> > To post to this group, send email to rubyonra...@googlegroups.com 
> <javascript:>. 
> > To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rubyonrails-talk/EDF36112-47D8-4749-B974-F55A2C57DBA6%40wdstudio.com.
>  
>
> > For more options, visit https://groups.google.com/d/optout. 
>
 
Since I'm not creating a new picture, only adding existing pictures to a 
person  I put an update action in the people controller but it tries to 
create a new picture and fails with validation :name can't be blank

def add_pictures_update
           if (params[:person][:person_id])
               @person=Person.find(params[:person][:person_id])
               @pictures = Picture.find(params[:person][:picture_ids])
               @person.pictures << @pictures
               respond_to do |format|
                 if @person.update
                            format.html {  redirect_to 
pictures_path(person_id: params[:picture][:person_id]), notice: 'Person 
picture updated.' }
                            format.json { render :show, status: :created, 
location: @picture }



-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/ad1ef9f1-5ac9-4cda-99d4-03a69845eb1d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to