On 2013-Aug-6, at 10:13 , masta Blasta wrote:

> selva4...@gmail.com wrote in post #1117870:
>> Hi,
>> 
>> The @user object is getting saved first. That time, there is no
>> instuition membership attached to it. So one is getting created. Then
>> when you save the instuition membership again inside the controller it
>> also gets saved.
>> 
>> Is this clear?
> 
> You just restated what i had initially written.
> 
> 
> The "problem" is something to do with how rails connects newly 
> initialized objects that are in memory but not yet in the database.
> 
> We have built two objects like this
> u = User.new
> im = InstitutionMembership.new :user => u
> 
> At that point the u (User) object doesn't know anything about the im 
> object. Saving the u object does not trigger an autosave on the 
> association, and the create callback creates a new membership. That's 
> somewhat expected.

So tell ActiveRecord that you *want* the autosave:

class User < ActiveRecord::Base
belongs_to :account
has_many :institution_memberships, :autosave => :always
has_many :institutions, :through => :institution_memberships

after_create :set_default_membership

def set_default_membership 
 if institution_memberships(true).blank? 
   institution_memberships.create(default_data_from_account) 
 end 
end 
end 

class InstitutionMembership < ActiveRecord::Base
belongs_to :user
belongs_to :institution
validates_uniqueness_of :user_id, :scope => :institution_id 
end

Note the argument to 'institution_memberships(true)' which causes the 
memberships to be reloaded from the database and the :autosave option added to 
the has_many.

> 
> The odd issues appear after -
> u = User.new
> im = InstitutionMembership.new :user => u
> u.save
> im.save

I assume that you've simplified this so that the account_id or however the 
default_data_from_account manages to find the institution_id is missing.

u = User.new
u.institutions << Institution.find(somehow)

or

u = User.new
u.institution_memberships << InstitutionMembership.new(:institution_id => 
from_a_parameter_perhaps)

and then the u.save should do the right thing.

-Rob

> 
> 'im' is aware of the user object, however it is not able to validate 
> against it. When it attempts to validate, the user_id==NULL. At the very 
> next log entry though, it saves itself with the correct user_id. So 
> somewhere between the validate callbacks, and the create and commit 
> callbacks, the 'im' object refreshed the user object and retrieved the 
> user_id. Also the new_record? flag on 'im' is still set, so a new row is 
> created.
> 
> One of the better solutions was actually to do:
> u = User.new
> im = u.institution_memberships.build
> 
> This is able to properly connect the objects in memory, and the process 
> works smoothly. The association is autosaved on u.save
> 
> -- 
> Posted via http://www.ruby-forum.com/.
> 
> -- 
> 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/fc9852aaa5e23f13c8185ac013988a08%40ruby-forum.com.
> For more options, visit https://groups.google.com/groups/opt_out.
> 
> 


-- 
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/27496B38-FDB8-4F74-A6BB-73888B537DA3%40gmail.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to