2011-07-19 17 views
0

Userオブジェクトが作成されるたびにUserInfoオブジェクトを作成してリンクします。Userオブジェクトが作成されるたびに、UserInfoオブジェクトも作成

残念ながら、これはどのUserInfo作成しません:

class User < ActiveRecord::Base 
    has_one :user_info 
    ... 

    def init 
    self.user_info = user_info 
    self.save! 
    end 

はなぜinitメソッドが呼び出されていませんか?私の目標に到達する方法?あなたのUserモデルで

答えて

1

sombeの技術は右ですが、彼の詳細は理想的ではありません。私は...とは思わないinitはRailsの下、特に魔法何もしません(:

class User < ActiveRecord::Base 
    has_one :user_info 
    before_create :create_user_info 
end 

編集:create_user_infoはすでにUserインスタンス上のメソッドであるため、実際には、あなたが望むすべてが何かのようですそれは基本的なRubyの下でもあります - あなたはinitializeを考えていますか?私はあなたがいると思います)。 initializeは、Rubyクラスのインスタンスがメモリ内に作成されたときに起動します。これは、データベースに作成されたモデルのインスタンスからある程度の余裕があるため、離婚しています。 build(まだ保存していない)を呼び出すことによって、またはデータベースからインスタンスを読み取ったために新しいクラスインスタンスが発生する可能性があります。

データベース操作を実行する場合は、ActiveRecordコールバックを使用する必要があります。あなたはmy answer to this questionが役に立つかもしれません。

0

、代わりにこのような初期化のbefore_saveフィルタを使用します。

before_save :create_user_info 

... 

private 

def create_user_info 
    user_info = UserInfo.new 
    if user_info.save 
     self.user_info_id = user_info.id 
    end 
end 
1

before_save作成および更新時のコールバックトリガー。 before_createは本当のエラー

class User < ActiveRecord::Base 
    has_one :user_info 
    ... 

    after_create do 
    create_user_info 
end 
+0

を返すことができますので、私はafter_createを使用することをお勧めしたい 、before_createはエラーを返すことができます。あなたは尋ねなければならない。 UserInfoの作成が失敗した場合でも(after_createを使用して)Userを作成したいのですか、その場合にユーザー作成全体を失敗させたいのですか(before_createを使用しますか)。 – Chowlett

+0

私は実際に別の方法でそのような仕事をしたいと思います。コントローラ**@user.valid? && @ user_info.valid? && @ user.save **。もう一つの方法は** acceptence_nested_attributes **を使うことです – Anatoly

関連する問題