2012-01-05 15 views
0

RoRにhas oneの関係を設定しようとしています。契約には1件の連絡先があります。契約テーブルにはcontact_idという列があります。間違った表を探している人

私はそうのような紅音ほたるの連絡先を呼び出すしようとすると:<%= agreement.contact.name %>を(接触テーブルが列nameを持っている)私はそれがagreement.contact_id

任意の提案を探してしなければならないエラーUnknown column 'contacts.agreement_id'を取得しますか?

+0

モデルの投稿 – s84

答えて

0

テーブルcontactsテーブルには外部キーの移行が必要です。つまり、整数agreement_idを作成する必要があります。 rake db:migrateを実行していることを確認してください。

FKはリレーションシップの 'belongs_to'テーブル側にあることを覚えておいてください。だから、has_oneの連絡先に連絡してbelongs_toにお問い合わせください。

+0

興味深い。これは、多くの異なるテーブルが接触するという事実に問題を引き起こすか? –

+1

多くのテーブルに連絡先がある場合は、連絡先の 'belongs_to'に多態的な関連付けを設定する必要があります。 Contactモデルでは、 'belongs_to:contactable、:polymorphic => true'です。その後、合意モデルでは: 'has_one:contact、:as:=:contactable'。また、Contactモデル 'contactable_type'(関連のクラス名を保存する)に新しい列を追加し、' agreement_id'の名前を 'contactable_id'に変更する必要があります。詳細は、「Rails Guide on Associations」をお読みください。 –

1

マイケルの答えは正しい。別のモデルに 'belongs_to'するモデルの場合、外部キーは常にテーブル内になければなりません。

しかし、あなたのための最良の答えは、関係を反転することがあります。つまり、あなたは必ず契約はではなく、1つの接触を持つの、に接触して属していないされていますか?関係を切り替えると、railsはコンタクトテーブルではなく、契約テーブルで外部キーを探すことを正しく認識します。

This Rails Guide has a more thorough discussionhas_onebelongs_toの中から選択してください。

+0

良い点ロブ - 私は、より良いアプローチを提供するのではなく、OPのために働いていることに対する解決策を提供しました。 'having_one'は私がむしろ疲れている 'デザイン'の匂いです。私はむしろより柔軟な 'has_many、through's –

関連する問題