9

正常に機能していても、これがどのように機能するかについて少し混乱しました。同じ他のモデルに 2 つの関連付けを持つモデルがあります。

会社には所有者がいて、会社にはクラス ユーザーの多くの従業員がいます。

ここに私の会社のモデルがあります:

class Company < ActiveRecord::Base
  validates_presence_of :name

  has_many :employee, :class_name => 'User'
  has_one :owner, :class_name => 'User'
  accepts_nested_attributes_for :owner, :allow_destroy => true
end

ここに私のユーザーモデルがあります:

class User < ActiveRecord::Base
  include Clearance::User
  attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
  validates_presence_of :lastname, :firstname
  belongs_to :company
end

今、私はこの会社の所有者を含む3人の従業員を持っていると仮定します. 最初に会社を作成するとき、所有者を ID 1 の従業員に設定し、他の 2 人 (2,3) は company_id (user.company=company) を設定することによって従業員リストに追加されます。3 つすべての company_id は、1 であると想定できる会社 ID に設定されています。

company.owner を要求すると適切なユーザーが取得され、company.employee を実行すると 3 つすべてが取得されます。

所有者をユーザー 2 に変更すると、company_id を nil に設定して、ユーザー 1 を従業員から自動的に削除します。これは問題ありません。単純な従業員として彼を追加しても、すべて問題ありません。

レールはどれがどれであるかをどうやって知っているのですか? つまり、従業員が単なる従業員ではなく所有者であることをどのように知るのでしょうか? これを定義するスキーマはありません。

所有者の関連付けを逆にして、会社をユーザーに属するようにする必要があると感じています。

4

3 に答える 3

12

現在のように、所有者と従業員を区別するものは何もありません。つまり、人を削除したり、所有権を変更しようとすると、問題が発生することになります。

François が指摘しているように、ID が最も小さい会社に属するユーザーが所有者であるという点で、あなたは幸運です。

この問題を解決するには、モデルを次のように関連付けます。

class Company < ActiveRecord::Base
  belongs_to :owner, :class_name => "user"
  has_many :employees, :class_name => "user"
  validates_presence_of :name
  accepts_nested_attributes_for :owner, :allow_destroy => true
end

class User < ActiveRecord::Base
  include Clearance::User
  attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
  validates_presence_of :lastname, :firstname
  belongs_to :company
  has_one :company, :foreign_key => :owner_id
end

Companies テーブルに owner_id という別の列を追加する必要がありますが、これにより関係がより明確に定義されます。また、所有者の変更に伴うトラブルを回避します。このルートに進み、users.company_id と companies.owner_id の両方を null にできないようにデータベースを設定すると、周期的な依存関係が発生する可能性があることに注意してください。

私は、accepts_nested_attributes_for が belongs_to の関係でうまく機能するかどうかはよくわかりません。

于 2009-10-10T02:37:13.967 に答える
5

has_oneは、次の構文糖衣です。

has_many :whatevers, :limit => 1

ビットを1つ追加する:limit => 1ことで、1つのレコードのみが返されるようにします。宣言が1つある場合は、:orderすべての状況で正しいレコードを返すための句があることを確認してください。この例では、所有者を示すためにEmployeeにフラグを付け、この列で並べ替えて正しいレコードを1番目に取得します。

Railsがこれを知っている理由についてのあなたの質問は、ほとんどのデータベースが主キーの順序でレコードを返すためです。したがって、最初に追加された従業員はID 1を持っているため、1番目に返されます。

于 2009-09-26T17:18:44.820 に答える
0

所有権と呼ばれるモデルを持つことができます-

ownership belongs_to company   
ownership belongs_to user

user has_many ownerships
company has_one ownership
于 2009-09-26T07:44:02.507 に答える