0

私は現在、Userが多くのPersonを持つことができ、それが多くのProjectを持つことができる Rails アプリを構築しています。

これは非常にうまく機能します。

さて、私の問題は、同じ組織に属している人もいれば、どの組織にもまったく属していない人もいるということです。

これまでに学んだことから、組織に関連するすべての情報を別のテーブル/モデルに移動するとよいでしょう。(間違っていたら訂正してください。)しかし、ある人がどの組織にも属していない場合、つまり私人である場合はどうなるでしょうか。これらすべてを Rails でモデル化するにはどうすればよいでしょうか?

助けてくれてありがとう。

4

3 に答える 3

4

あなたの問題は、組織に属しているかもしれないし、属していないかもしれない人がいます。さて、どのように設定しますか?

あなたが言ったように、組織関連のデータを別のテーブルに移動します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 Projectmodelとの関係は飛ばしました。質問の一部を見逃した場合はお知らせください。


更新: 最後のコメントに基づいて
、シナリオをリストしましょう:

  1. 個人と組織の両方がアドレスを持つことができます。
  2. ある人が組織に属していない場合、その人は自分の住所を持っている可能性があります。
  3. 彼が組織に属している場合、彼のアドレスは実際には組織のアドレスです。または、独自のアドレスを持っている可能性があります。

個人と組織で繰り返される唯一のものである場合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

于 2012-10-04T11:13:51.863 に答える
1

私が状況を理解したように:

状況

この状況を次のようにレールに変換できます。

class Organisation < ActiveRecord::Base
  has_many :persons
end

class Person < ActiveRecord::Base
  belongs_to :user
  belongs_to :organisation
end

class User < ActiveRecord::Base
  has_many :persons
end
于 2012-10-04T11:21:58.563 に答える
0

これを試してみてくださいそれはあなたを助けるかもしれません

class Person < ActiveRecord::Base
 belongs_to :organization
end
class Organization < ActiveRecord::Base
 has_many :persons 
end

個人が組織に属している場合は、組織テーブルperson_idで指定されます。そうでない場合、個人が組織に属していない場合は、組織テーブルでperson_idはnilになります。となることによって

in your console
-> product = @product.organization  
    # if person_id given then you get result
    # if person_id does not given then get null or blank
于 2012-10-04T11:21:52.837 に答える