2014-03-02 71 views
0

正在使用的相關項目:Rails 3.2,Mongoid和Devise。無法從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是基於應用程序中的其他邏輯自動定義的。

我想根據用戶模型的account_level自動填充值display_position

我試過各種方式讓這個工作,但我似乎想通了。

實現此目的的最佳方式是什麼?

+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

謝謝你的迴應,Drinor。這與我試圖做的非常相似,但我仍然爲'nil:NilClass'提出同樣的錯誤'未定義的方法'account_level'。它似乎沒有創建和存儲在數據庫中的配置文件(這意味着它不與用戶關聯),這就是爲什麼它會拋出錯誤。如果我使用'after_save'過濾器,則會在數據庫中創建一個配置文件,但尚未與用戶關聯 - 因此仍會返回相同的錯誤。關於發生了什麼的任何想法? – sevens

+0

我不知道,它適用於我,請檢查您的代碼。 – drinor

+0

我能想到的唯一可能是它與mongoid創建/保存屬於另一個模型的模型的方式有關。一旦保存配置文件(用戶實際上在窗體上點擊保存配置文件),然後我可以調用'self.user.account_level'。 – sevens