0

Rails プロジェクトの多対多の関係で問題が発生しています。それは例で説明することができます:

モデルPersonとがありPhoneNumber、 が結合しているとし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

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

これを最もエレガントに実現するにはどうすればよいですか? 一致するsetを探すためにbefore_validationフックを挿入しようとしましたが、これにより非常に奇妙な動作が発生しました (Rails サーバーがメッセージでクラッシュするなど)。PersonPhoneNumberPhoneNumberphone_number_idIllegal instruction: 4

4

2 に答える 2

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")
于 2012-04-25T06:55:48.497 に答える
0

Rachel the Rails のドキュメントには次のように書かれています。

has_and_belongs_to_many 関連付けは、介在するモデルなしで、別のモデルとの直接多対多接続を作成します。

違いはなんですか?

于 2013-08-13T22:31:11.087 に答える