私は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の方法"がありますか?
ありがとうございました。
おかげで、設定する
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はい、いいですね。そして、Rails 3は、これを行うために、より最適な方法を有することができる - それは他の誰のアイデアを持っているかどうかを確認するために開いたあなたの質問を保つために、おそらく良いアイデアです。 – joelparkerhenderson
ありがとうございます、他の誰かがより「オプションの」ソリューションを持っていない限り、数日後に正しい答えが得られます。 :) – Anders