2009-07-21 6 views
12

私は2つのモデル、ユーザとグループを持っています。各グループには多数のユーザーが存在し、各ユーザーは多数のグループに属します。Rails(ActiveRecord)多対多テーブル

私は現在のような単純なものを持っている:

ユーザー:

has_many :groups 

グループ:

has_many :users 

は、だから私はちょうどGROUP_IDとuser_idを持つ行を作成しているgroups_usersテーブルを持っています。 これに別の列を追加したいのですが、カスタムSQL呼び出しを使用せずにモデルからアクセスするにはどうすればいいですか?グループモデルで私はself.usersに行くことができ、ユーザーで私は行くことができますself.groups

この表の第3列をユーザーモデルから変更する方法はありますか?これは混乱している場合、ここでは、この

答えて

12

にアドバイスしてください

申し訳ありませんが役立つはずチュートリアルのカップルです。基本的には、has_and_belongs_to_manyまたはhas_many:through(推奨)という多対多の作業を行うための2つの方法があります。

リンク:

  1. http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off
  2. http://railscasts.com/episodes/47-two-many-to-many
  3. http://railscasts.com/episodes/154-polymorphic-association
+0

特に第二リンク。実際にhas_and_belongs_to_manyの素晴らしい例。 –

+0

これらのリンクはまだ関連していますか?= – shem

2

I [追加] [users_groups]へ...質問が Iアクセスを行う方法です別の列モデルを使用せずに カスタムSQL cすべて?

あなたのUserモデルまたはあなたのGroupモデルのメソッドを呼び出すことによって、あなたのuser_groupsテーブルの列にアクセスしたいように聞こえます。

ヒント:

私はActiveRecordのの複数形の期待と連携する「user_groupsを」表に名前を付けるだろうが、私はそれが不可欠だかはわかりません。

Daveのアドバイスに続いて、あなたは「has_many :through」技術を使用して物事を設定したいと思いますが...

# Declare a Model based on the many-to-many linking table. 
class UserGroup < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class User < ActiveRecord::Base 
    has_many :user_groups 
    has_many :groups, :through => :user_groups 
end 

class Group < ActiveRecord::Base 
    has_many :user_groups 
    has_many :users, :through => :user_groups 
end 

は、ユーザーモデルからこの表の3番目の列を変更する方法はあります?

これはちょっと不明であるが、各UserUserGroupsの多くを持つことができることに留意してください。したがって、3番目の列を変更する場合は、探している特定の列を見つけなければなりません。

+0

UserGroupテーブルに余分なデータを必要としない場合は、そのActiveRecordを完全にスキップして、ユーザーとグループの間の 'has_and_belongs_to_many'関連を結合テーブルで使用します。他の答えの2番目のリンクを参照してください。 –

+0

をdjangoに追加すると、多くのヘルパーテーブルに3番目のカラムを追加するのは簡単です。単に "through"でアクセスするモデルにフィールドを追加するだけです。あなたの例の別の列は、あなたがeである場合に役立ちます。 g。グループにある特定の状態(アクティブまたは非アクティブ)をユーザーに与えたい。 – Timo

7

Rails 3では、アルファベット順に結合するテーブルの複数の名前を使用して、多対多リレーションシップ用の結合テーブルを作成する必要があります。したがって、この場合はgroups_usersとなります。

モデル

class GroupsUser < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class User < ActiveRecord::Base 
    has_many :groups_users 
    has_many :groups, :through => :groups_users 
end 

class Group < ActiveRecord::Base 
    has_many :groups_users 
    has_many :users, :through => :groups_users 
end 
+1

関連するフィールドにアクセスする方法を知ることは興味深いでしょう – Timo

関連する問題