152

この例ではuser、 noを使用して を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

レールに0または1の関連付けを持つ方法はありますか?

4

3 に答える 3

380

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協会のドキュメントを参照してください。

于 2010-03-18T21:00:38.110 に答える
19

エラーメッセージをよく見てください。プロファイル テーブルuser_idに必要な列がないことを示しています。モデルで関係を設定することは、答えの一部にすぎません。

user_id列をプロファイル テーブルに追加する移行も作成する必要があります。Rails はこれが存在することを想定しており、存在しない場合はプロファイルにアクセスできません。

詳細については、次のリンクをご覧ください。

協会の基本

于 2010-03-19T04:44:06.360 に答える
-14

である必要がありhas_oneます。機能しない場合buildは、次を使用できますnew

ModelName.new( :owner => @owner )

と同じです

@owner.model_names.build
于 2010-03-18T20:45:13.997 に答える