この例では、user
なしでprofile
を作成し、後でそのユーザー用にprofile
を作成します。 has_one
アソシエーションでビルドを使用しようとしましたが、爆発しました。私がこれが機能していると思う唯一の方法は、has_many
を使用することです。 user
は、最大で1つのprofile
のみを持つことになっています。
私はこれを試してきました。私は持っています:
class User < ActiveRecord::Base
has_one :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
end
しかし、私がするとき:
user.build_profile
エラーが表示されます:
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4) LIMIT 1
Railsに0個または1個の関連付けを持つ方法はありますか?
build
メソッドのシグネチャは、has_one
とhas_many
の関連付けによって異なります。
class User < ActiveRecord::Base
has_one :profile
has_many :messages
end
has_many
関連付けのビルド構文:
user.messages.build
has_one
関連付けのビルド構文:
user.build_profile # this will work
user.profile.build # this will throw error
詳細については、has_one
アソシエーション ドキュメント をお読みください。
エラーメッセージをよく見てください。 profileテーブルに必要な列user_id
がないことを示しています。モデルに関係を設定することは、答えの一部にすぎません。
また、user_id
列をプロファイルテーブルに追加する移行を作成する必要があります。 Railsはこれが存在することを期待し、そうでない場合はプロファイルにアクセスできません。
詳細については、次のリンクをご覧ください。
ユースケースによっては、メソッドをラップし、見つからない場合に関連付けを自動的に構築すると便利です。
old_profile = instance_method(:profile)
define_method(:profile) do
old_profile.bind(self).call || build_profile
end
#profile
メソッドを呼び出すと、関連するプロファイルが返されるか、新しいインスタンスが作成されます。