あなたの問題は、組織に属しているかもしれないし、属していないかもしれない人がいます。さて、どのように設定しますか?
あなたが言ったように、組織関連のデータを別のテーブルに移動しますorganizations
。そして、あなたのpersons
(またはpeople
?)にはorganization_id
. 個人がどの組織にも属していない場合は、単にnull になります。モデルの関係はやや似ています。
class Person < AR::Base
belongs_to :organization
end
class Organization < AR::Base
has_many :persons #or people?
end
User
ここではand Project
modelとの関係は飛ばしました。質問の一部を見逃した場合はお知らせください。
更新: 最後のコメントに基づいて
、シナリオをリストしましょう:
- 個人と組織の両方がアドレスを持つことができます。
- ある人が組織に属していない場合、その人は自分の住所を持っている可能性があります。
- 彼が組織に属している場合、彼のアドレスは実際には組織のアドレスです。または、独自のアドレスを持っている可能性があります。
個人と組織で繰り返される唯一のものである場合address
は、別の表に移動することをお勧めしますaddresses
。
組織: has_one :address
人: has_one :address
更新 2:
物事は少し条件付きなので
- 個人が組織に属している場合は、組織
person.address
の住所を返します。
- それ以外の場合
person.address
は、独自のアドレスを返します。
次に、シンプルに保つために次の方法をお勧めします。モデルにメソッドcurrent_address
(または任意の名前) を追加しますPerson
。
def current_address
return organization.address if organization
return address
end
person.current_address
決定を下す代わりに呼び出しますperson.address
。