私はthisを読みました。違いを理解しています。Rails 4 - has_oneとbelongs_to throwing errors
しかし、私は奇妙な動作を投げているアプリケーションを継承しています(私は間違っていると思いますが、これは正常です)。
2つのモデルがある:
p = Pod.find(5)
と、このポッドは、これが正しい14のpod_admin_id
値を有する示す:レールコンソールで
class Pod < ActiveRecord::Base
has_one :pod_admin
end
class PodAdmin < ActiveRecord::Base
belongs_to :pod
end
、私はこれを試みました。
私はPodAdminを変更しようとしました:
p.pod_admin = PodAdmin.last
と、このエラーがスローされます。
NoMethodError: undefined method pod_admin_id for #<PodAdmin:0x007fa401f1e710>
それはなぜですか?私は何が欠けていますか?コメント/回答に基づいて
EDIT
は、モデルを変更せずに、私はこの試みた:
pa = PodAdmin.last
pa.pod = p
をし、それが動作しますが、私は、コンソールは新しいpod_idで最後PodAdminを返す参照してください。
しかし
pa.save
と
p.save
両方の前と同じエラーをスローします。
データベーススキーマを見ると、Podテーブルにはpod_admin_idフィールドがあり、PodAdminテーブルにはpod_idフィールドがあります。
私はこのスキーマを継承しました。元の開発者がこれを正しく設定しているかどうかは不思議です。確かにどちらの方向からでも関係を更新できるはずです - それはhas_oneとbelongs_toの作成のポイントではないので、このような双方向の関係を持つことができますか?
EDIT 2
私は、私が代わりにポッドテーブルのPodAdminテーブルに次の行を追加したことで問題が見つから:
validates :pod_admin_id, uniqueness: {scope: :id, message: 'The Pod already has a PodAdmin'}
謝罪を - しかし、あなたが見ることができるように、どのような私がここで達成しようとしているのは、Podが2つのPodAdminを持つのを防ぐことです。これはそれを達成するようには見えません。
p = Pod.find(5)
pa_last = PodAdmin.last
pa_first = PodAdmin.first
pa_last = p
pa_first = p
pa_last.save
pa_first.save
を、今の両方のPAのは、同じpod_idを持っている:
私はこれを行うことができます。 どうしたら起こるのを防ぐことができますか?
EDIT 3
問題は、以前の開発者は両方のテーブル(has_one
とbelongs_to
)への外部キーを置くということであった多くの読書と試験後と@Anandと@Spickerman両方のおかげで。 belongs_toテーブルのみが外部キーを持つ必要があります。また、関係は間違った方法で定義されていました。ただし、これを修正しても堅牢なソリューションは保証されません。私は非常に類似の問題を持つ他の人にthisと読むことをお勧めします。
呼び出します。アソシエーション設定では、 'pod_admins'テーブルは' pod_id'を持っていなければなりません。 – Pavan
@Pavanが正しいです。 'pod_admins'テーブルに' pod_id'が必要です。 '' Pod''は 'belongs_to:pod_admin'に' 'PodAdmin'' has_one:pod'を入れてください。 –
pod_adminsテーブルにはpod_idフィールドがあります。私は説明するために私の質問を更新した - それはどちらの側からも関係を更新することはできないようだ。 – rmcsharry