2012-04-07 7 views
1

私はRailsを使ってプロジェクト管理アプリケーションを開発しています。私は2つのモデルオブジェクトを持っています。この場合、UserとAccountは多対多の関係を持っています(CompanyはAccountのより良い名前かもしれません)。ユーザーがサインアップすると、新しいアカウントが作成され(.buildを使用して)、ネストされたフォームを作成します。 Accountモデルには、nameとaccount_adminという2つのフィールドがあります。最初のユーザーがそのアカウントを作成するとき、私はaccount_adminをユーザーIDに設定したいと思います。しかし、私はこれを動作させることはできません。Rails 3.2(多対多)で.buildメソッドを使用するとき、ActiveRecordモデル属性を設定するにはどうすればいいですか

モデルは、このように設定されています

class Account < ActiveRecord::Base 
    attr_accessible :name, :account_admin 

    validates_presence_of :name 

    has_many :projects, dependent: :destroy 
    has_many :collaborators 
    has_many :users, through: :collaborators 
end 

class User < ActiveRecord::Base 
    has_secure_password 
    attr_accessible :email, :name, :password, :password_confirmation, :accounts_attributes 

    has_many :collaborators 
    has_many :accounts, through: :collaborators 
    accepts_nested_attributes_for :accounts 
    [...] 

UserControllerでは、次のようになります。

def new 
    if signed_in? 
    redirect_to root_path 
    else 
    @user = User.new 
    # Here I'm currently trying to set the account_admin value, but it seems to be nil. 
    account = @user.accounts.build(:account_admin => @user.id) 
    end 
end 

私も​​アクションを作成するを移動しようとしましたが、フィールドから消えますフォーム。

私が望むことを達成するための適切な方法は何ですか(作成時にaccount_adminをユーザーIDに設定する)?または、どのユーザーがアカウントを作成したか(つまり、関係テーブルを使って何かを実行する)を見つけるより良いアプローチがありますか?

更新

@joelparkerhendersonからの助けを借りて、私はそれが動作するようになったと思います。私はafter_create :set_account_adminを呼び出す

def set_account_admin 
    account = self.accounts.last 
    if account.account_admin == nil 
    account.account_admin = self.id 
    account.save 
    end 
end 

:私はこのようになります私のUserモデル内のメソッドを作りました。これはうまくいきますが、同じことをするための "Railsの方法"がありますか?

ありがとうございました。

答えて

1

#newに電話すると、ユーザーにはまだIDがありません(これはゼロです)。

ユーザーが#saveの場合、Railsはユーザーに新しいIDを自動的に与えます。

その後、動作するように見え、新規アカウントのaccount_admin

+0

おかげで、設定するafter_create Active Recordのコールバックを使用することができます。私はUserモデルで 'after_create'と呼ぶこのようなメソッドを作った。 'DEF アカウントをset_account_admin = account.account_admin場合self.accounts.last == nilを account.account_admin = self.id account.save エンド end'が、これはそれを行うための正しい方法ですか? – Anders

+0

はい、いいですね。そして、Rails 3は、これを行うために、より最適な方法を有することができる - それは他の誰のアイデアを持っているかどうかを確認するために開いたあなたの質問を保つために、おそらく良いアイデアです。 – joelparkerhenderson

+0

ありがとうございます、他の誰かがより「オプションの」ソリューションを持っていない限り、数日後に正しい答えが得られます。 :) – Anders

関連する問題