2012-04-24 15 views
0

Railsプロジェクトで多対多リレーションシップに問題があります。例を挙げて説明することができます:Railsの多対多リレーションおよびネストされたフォーム:オブジェクトが既に存在する場合にアロケートする

PersonPhoneNumberというモデルがあり、これはPersonPhoneNumberで結ばれています。この関係は、複数の電話番号を持つことができ、同じ電話番号(ヘルプデスクなどの場合)で複数の人に連絡できるため、多対多です。

class Person < ActiveRecord::Base 
    has_many :person_phone_numbers 
    has_many :phone_numbers, :through => :person_phone_numbers 
end 

class PhoneNumber < ActiveRecord::Base 
    has_many :person_phone_numbers 
    has_many :people, :through => :person_phone_numbers 
    validates :number, :uniqueness => true 
end 

class PersonPhoneNumber < ActiveRecord::Base 
    belongs_to :person 
    belongs_to :phone_number 
end 

人の連絡先情報を作成/更新できる人のフォームがあります。私はこれを使ってBobに番号555-555-1212を割り当てます。その番号のPhoneNumberオブジェクトが存在しない場合は、作成します(標準accepts_nested_attributes_forの動作のように)。しかし、それが存在する場合は、PersonPhoneNumberオブジェクトを作成してBobにそのPhoneNumberを関連付けるだけです。

これを最も上手くいく方法は? PersonPhoneNumberbefore_validationフックを入れて、PhoneNumberを探してphone_number_idに設定しようとしましたが、実際には奇妙な動作(メッセージがIllegal instruction: 4で私のRailsサーバーがクラッシュするなど)が発生しました。

答えて

1

存在は使用できますか?このように、最初の存在を確認する方法:

@person.phone_numbers.build(number: "555-555-1212") unless @person.phone_numbers.exists(number: "555-555-1212") 

それとも、このような何か行うことができます。

PhoneNumber.find_or_create(person_id: @person.id, number: "555-555-1212") 
+0

これは多対多の関係であり、 'has_many/belongs_to'ではありません。 –

0

レイチェルをRailsのドキュメントがこれを言う:

has_and_belongs_to_manyアソシエーションの関連付けは、直接多くを作成し、モデル間に介在することなく、別のモデルとの多対多接続

違いは何ですか?

関連する問題