Вызов обновления делегата Rails - PullRequest
8 голосов
/ 10 февраля 2012

У меня две модели:
User (электронная почта: строка)
Profile (имя: строка)

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 = 'some@ema.il'
u.save                  #=> both User and Profile are saved

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

u.email = 'new@ema.il'
u.save                  #=> true, new User email was saved, Profile - still not!

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

Почему профиль не обновляется (сохраняется только в первый раз)?Как это исправить?

Ответы [ 2 ]

12 голосов
/ 27 марта 2012

ArcaneRain, вы должны добавить опцию «автосохранение» в ваши отношения вместо добавления обратного вызова для этого:

has_one :profile, :autosave => true

Вам также следует изучить «зависимые» варианты. Больше информации здесь: http://guides.rubyonrails.org/association_basics.html#has_one-association-reference

1 голос
/ 10 февраля 2012

Этот вопрос выглядит знакомым:)

Только что попробовал и все работает:

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

def save_profile
  self.profile.save
end

Sidenote:

Я советую вам добавить область по умолчанию , чтобы всегда загружать profile вдоль user, если вы часто используете обе модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...