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. 
>
>
I was having trouble hiding and showing elements on the form so I created a 
separate action in the pictures controller to handle the submission of the 
form that selects pictures to add to the person from existing pictures in 
the database It attempts to create a new picture I guess because validation 
fails :name cannot be blank

def add_from_pictures_create
           if (params[:picture][:person_id])
               @person=Person.find(params[:picture][:person_id])
               @pictures = Picture.find(params[:person][:picture_ids])
               @person.pictures << @pictures
               respond_to do |format|
                 if @person.save
                            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/60777aba-7acc-4cd1-9184-7a12332ce9c6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to