Rustam Gasanov
Rustam Gasanov

Reputation: 15791

Rails delegate update call

I have two models:
User (email:string)
Profile (name:string)

class User < ActiveRecord::Base
   has_one :profile   
   delegate :name, :name=, :to => :profile   
end
class Profile < ActiveRecord::Base
  belongs_to :user
end

rails c

u = User.new 
u.build_profile         #=> init Profile
u.name = 'foo'
u.email = '[email protected]'
u.save                  #=> both User and Profile are saved

u.name = 'bar'
u.save                  #=> true, but changes in Profile were not saved!

u.email = '[email protected]'
u.save                  #=> true, new User email was saved, Profile - still not!

u.name                  #=> 'bar', but in database it's 'foo' 

Why the Profile is not being updated(saved only for the first time)? How to fix this?

Upvotes: 8

Views: 3602

Answers (2)

gamov
gamov

Reputation: 3869

ArcaneRain, you should add the 'autosave' option on your relationship instead of adding a callback for that:

has_one :profile, :autosave => true

you should also investigate the 'dependent' options. More info here: http://guides.rubyonrails.org/association_basics.html#has_one-association-reference

Upvotes: 14

apneadiving
apneadiving

Reputation: 115541

This question looks familiar :)

Just tried this and it works:

after_save :save_profile, :if => lambda {|u| u.profile }

def save_profile
  self.profile.save
end

Sidenote:

I advise you to add some default scope to always load the profile along the user if you often use both models.

Upvotes: 1

Related Questions