1

2つのテーブルがusersありgroupsます。ユーザーはグループを所有しており、複数のグループに所属することができます。グループは1人のユーザーに属し、多くのユーザーを持つことができます。

したがって、私のuserモデルには

has_and_belongs_to_many :groups
has_many :groups

私のgroupモデルのために私は持っています

has_and_belongs_to_many :users
belongs_to :user

移行には結合テーブルもあります。

def change
  create_table :groups_users, :id => false do |t|
    t.integer :group_id
    t.integer :user_id
  end
end

私の質問は、これは意味がありますか?の上に持っていることで何か間違ったことhas_manyをしているような気がします。belongs_tohas_and_belongs_to_many

4

2 に答える 2

2

私がこれにアプローチする方法は、これは私自身の個人的な方法論であり、次のような 3 つのテーブル/モデルを使用することです。

group_user.rb

class GroupUser < ActiveRecord::Base
  attr_accessible :user_id, :group_id

  belongs_to :group
  belongs_to :user
end

group.rb

class Group < ActiveRecord::Base
  attr_accessible :owner_id

  validates_presence_of :owner_id

  has_many :group_users
  has_many :users, through: :group_users
end

user.rb

class User < ActiveRecord::Base
  attr_accessible :some_attributes

  has_many :group_users
  has_many :groups, through: :group_users
end

Group次に、オブジェクトを作成するたびに、Userそれを作成したは、それ自体をの属性にid配置し、それ自体をテーブルに配置します。owner_idGroupGroupUser

于 2013-02-06T18:55:35.597 に答える
2

複数の外部キーが同じリレーションシップを指さないようにするための別のオプションは、結合モデルを使用してから結合モデルにフラグを追加して、ユーザーが所有者であるかどうかを示すことです。

例えば:

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, through: :memberships
  has_many :owned_groups, through: memberships, conditions: ["memberships.owner = ?", true], class_name: "Group"
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group

  #This model contains a boolean field called owner
  #You would create a unique constraint on owner, group and user
end

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, through: :memberships
  has_one :owner, through: :memberships, conditions: ["memberships.owner = ?", true], class_name: "User"
end
于 2013-02-06T18:56:44.937 に答える