2014-03-02 3 views
0

Используемые элементы: Rails 3.2, Mongoid и devize.Невозможно получить значение от ассоциированной модели в Rails

У меня есть следующие две модели:

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    has_one :profile, autosave: true, dependent: :delete 
    field :account_level 
end 


class Profile 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    belongs_to :user 
    field :display_position 
end 

Мое приложение устанавливается так, на успешной регистрации учетной записи (пользователя) человек автоматически перенаправлены для создания нового профиля. account_level определяется автоматически на основе какой-либо другой логики в приложении.

Я хотел бы, чтобы значение display_position было автоматически заполнено на основе модели account_level модели пользователя.

Я пробовал различные способы заставить это работать, но я могу понять, как это понять.

Каков наилучший способ достижения этого?

+0

Используйте '' before_save' или before_create' фильтр на вашей модели. –

+0

Я сделал это, но ассоциация создана пока. Когда я пытаюсь запустить 'self.position_order = profile.user.account_level', он выдает ошибку, потому что пока еще не создана ассоциация пользователей с профилем. – sevens

+0

Затем попробуйте фильтр 'after_save' или' after_create'. –

ответ

0

Как говорят люди в комментариях, использование обратного вызова для этого:

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    has_one :profile, autosave: true, dependent: :delete 
    field :account_level 
end 


class Profile 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    belongs_to :user 
    field :display_position 

    before_create do 
     self.display_position = self.user.account_level 
    end 
end 

Затем в консоли вы можете проверить его:

user = User.create(account_level: 'hello') 
profile = Profile.create(user: user) 
profile.display_position 
=> "hello" 
+0

Спасибо за ответ, Дринор. Это очень похоже на то, что я пытался сделать, но я все еще придумываю ту же ошибку 'undefined method' account_level 'для nil: NilClass'. Кажется, он не создал и не сохранил профиль в БД (что означает, что он не связан с пользователем), поэтому он бросает ошибку. Если я использую фильтр 'after_save', профиль создается в БД, но пока не связан с пользователем, - таким образом, он все равно возвращает ту же ошибку. Любые идеи относительно того, что происходит? – sevens

+0

Я не знаю, это работает для меня, проверьте свой код. – drinor

+0

Единственное, о чем я могу думать, это, возможно, что-то связано с тем, как мангоид создает/сохраняет модели, которые «принадлежат» другой модели. Как только профиль будет сохранен (пользователи фактически нажимают на сохранение профиля в форме), я могу называть его 'self.user.account_level'. – sevens

Смежные вопросы