2012-03-19 25 views
4

グループのメンバー間の経費/負債を追跡するためのRailsアプリケーションを構築しています。これまでのところ、私はGroups、Users、Expensesのためのモデル - 基礎を持っています。今、私はグループとユーザーの関連付けを理解しようとしています。たとえば、グループには多数のユーザーが存在し、ユーザーは多数のグループを持つことができます。したがって、私は結合テーブルを使用してHABTM関連付けを設定します。しかし、私は混乱しています。なぜなら、グループには1人の所有者がいることもあり得ます。私は今だところである:Rails - 同じモデルへの複数の関連付け

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_one :owner, :class_name => "User" 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :groups 
end 

は、グループテーブルの上にOWNER_IDフィールドには、現在ありますが、私は試してみてgroup.ownerに関わる何かをするとき、私はPostgreSQLのエラーcolumn users.group_id does not existを取得しています。私はかなり失われています - ここで同じモデルへの複数の関連付けを表現する最良のアイデアはありますか?

+0

'HABTM 'はすでにグループに多数のユーザーがいることを意味します。そのユーザーの1人は「所有者」でなければなりません。あなたができることは、 'has_many:through'を使用し、そのフィールドを使ってグループの所有者を指定することです。 – Zabba

答えて

12

だから私は、私はあなたがで取得しようとしているものをフォロー、これはダイヤで作成し、迅速ERDだと思う:

simple erd

あなただけの間の所有権のための直接的な関連を追加する必要があるように見えますユーザーとグループテーブルとモデルがより明確になり、複数のuser_idカラムについての混乱を避けるために、カラムowner_idを使用しました。次に、次のモデルが動作します:

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    belongs_to :owner, :class_name => "User", :foreign_key => "owner_id" 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :groups 
    has_many :owned, :class_name => "Group", :foreign_key => "owner_id" 
end 
+0

私のコードで 'User'の二重属性' groups'を気にしませんでした。 –

+0

成功!私は 'has_one-/belongs_to-'所有者協会が私のグループモデルで切り替わったように見え、所有ソリューションは完璧です。ダイアグラムも大好き。ありがとう! – ark

+1

ダイアグラムで...この男は誰ですか?よくやった。 –

1

何について:

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :users, :through => :membership 
    has_one :owner, :class_name => "User" 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :groups, :through => :membership 
    has_many :owned, :class_name => "Group" 
end 

そしてuser_idgroup_idでモデルMembershipを作成しますか?

関連する問題