2012-02-09 8 views
0

私はrails 3.2.1と最新のものを使用しています。この宝石のようなUserモデルで私たちに多くの列を与える:など



current_sign_in_at, remember_created_at, last_sign_in_atだから私はきれいな私のモデルを維持し、テーブルにid,email,password,timestamps以外のすべてのフィールドを移動することを決定するには、どのように探し、user_sessions(モデルUserSession)と呼ばれますこれを解決するには、デリゲートメソッドを見つけましたが、この機能を実現する方法を理解していません。もし他のアイデアがあれば、完全に説明してください。

初めて、私はテストアプリケーションで簡単な例を試しました。私はUser(電子メール:文字列)とProfile(ユーザーID:整数、名前:文字列)の2つのモデルを作成します。ここで彼らは、次のとおりです。Rails Devise代理人が両方のモデルを設定して保存する

class User < ActiveRecord::Base 
    has_one :profile 
    delegate :name, :name=, :to => :profile, :allow_nil => true 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 
end 

私はレールcを開いて、試してみました:

u = User.new #=> new user object 
u.name #=> nil 
u.name = 'something' #=> "something" 
u.name #=> nil 

を、それはまだいくつかの理由のためにnilを後にすることをので、私はしても、値を設定することはできません。私は値を変更し、このオブジェクトを保存することを期待します。また、私はそれだけでUser、ないProfileを救うことを理解し、私はおよそように、私は必要な値を処理し、Profileオブジェクトを保存しますbefore_saveを実装すると思う:

before_save :save_profile 

def save_profile 
    #get self.name and somehow save profile object 
end 

と更新機能のために同じ。それは実現できますか?または、より良い方法を提案してください。また、これをDeviseユーザモデルに実装したいと再度注意してください。ありがとう!

答えて

0

試してみてください。あなたの答えのための

u = User.new #=> new user object 
u.build_profile 
u.name #=> nil 
u.name = 'something' #=> "something" 
u.name #=> ? 
+0

ありがとう!これはまさに私が必要なものです! –

+0

Createは完全に機能しますが、もう1つ質問があります。既存のビルドを更新するにはどうすればいいですか? 'u.email = 'new_val''と' u.save'を変更すると 'User'モデルが更新されますが、' u.name =' new_val''を試してみると 'u.save'は何もしません。 (0.2ms)begin transaction (0.1ms)コミットトランザクション => true ' –

+0

プロファイルを保存するためにユーザーモデルにコールバックを追加すると問題ありません – apneadiving

関連する問題