0

一見すると、これは簡単な質問のように見えるかもしれません。以前に回答されていると思われるかもしれませんが、完全ではありませ。私は Web をかなり調べましたが (スタック オーバーフローを含む)、答えを見つけることができませんでした。

これは私が見つけた最も近いものです

Rails 4 と MySQL を使用しています

データベースの構造は次のとおりです。

パートナー テーブル

id
name
primary_contact_id

連絡先テーブル

id
partner_id
first_name
last_name

かなり簡単ですよね?自明。

class Partner < ActiveRecord::Base

    has_one :primary_contact, :class_name => "Partners::Contact", :primary_key => 'primary_contact_id'

    has_many :contacts, :class_name => "Partners::Contact"

    accepts_nested_attributes_for :primary_contact

    validates_presence_of :primary_contact

end

class Partners::Contact < ActiveRecord::Base

    belongs_to :partner

end

ご覧のとおり、パートナーを作成するときは、主要な連絡先が必要です (フォームなどはすべて適切に設定されています)。

私が経験している唯一の問題は、primary_contact がパートナーと共に作成されるときに、作成される連絡先の partner_id を作成される partner_id に割り当てる必要があることを ActiveRecord が認識しないことです...

ここでのベストプラクティス?その連絡先がプライマリかどうかを示す (bool またはその他の方法で) 連絡先テーブルに列を作成したくありません。それは適切なデータベースの正規化ではありません (「rails の規則」が何を宣伝しているかに関係なく)。

あなたの助けと考えをありがとう!

4

1 に答える 1

0

次のような方法でパートナーを作成していると思います。

Partner.create params[:partner] # { ..., primary_contact: {} }

したがって、ここで連絡先を作成していることをレールが知る方法はありません。スキーマを調整しない簡単な解決策の 1 つは、追加のクエリを使用してデータを正規化することです。

class Partner
  after_create :update_primary_contact

  def update_primary_contact
    self.contacts << self.primary_contact
  end
end
于 2013-10-24T21:13:03.603 に答える