2011-12-07 13 views
1

したがって、UserGroupという2つのモデルがあります。別のモデルを作成する際にモデルを作成するためのベストプラクティス

User belongs_to :group

Group has_many :users

新しいUserを作成するときは、すでに作成されたGroupを確認して割り当て、またはユーザー指定の情報に基づいて新しいGroupを作成します。 Group.find_or_create_by_name("Name")これを行うには良い方法のようですが、私の質問はどこに配置する必要がありますか?私はそれがuser.rbにする必要があります "脂肪モデル、スキニーコントローラ"に従っていると思います。それがモデルにある場合、ユーザー作成時にユーザー提供の文字列を渡す最善の方法は何ですか? user.rbにメソッドを設定して、そのメソッドをusers_controller.rbに呼び出す必要がありますか?

そして私は、関連する質問を推測:私は私のスキーマが照会の目的のために

create_table "users" do |t| 
    t.integer "group_id" 

を反映すべきであることを知っています。 Railsはこれらを「自動的に」どのようにリンクしていますか? Groupモデルを作成するときは、string:idという列を持つ必要があると思いますが、Railsは2つだけをリンクしていますか?

申し訳ありませんが、私は団体の理解が不足していますが、奇妙なことを一緒にハッキングしないようにしています。

答えて

1

まず、あなたが書いたことによると、グループには複数のユーザーが参加できますが、ユーザーは1つのグループにしか参加できません。

通常、グループには複数のメンバーがあり、ユーザーは複数のグループのメンバーになることができます。これを実現するには、membershipというアソシエーションモデルを作成します。

だから、あなたのユーザーモデルがあります:

has_many :memberships 
has_many :groups, :through => :memberships 

そして、あなたのグループのモデル持っていた:

create_table "memberships" do |t| 
    t.integer "group_id" 
    t.integer "user_id" 
    t.timestamps 
end 

add_index :memberships, :group_id 
add_index :memberships, :user_id 

has_many :memberships 
has_many :members, :through => memberships 

協会のようなものになり、それ自身のテーブルを持っています

元の質問に答えるには、tに関係なくユーザーが作成されたときにグループを作成する必要がある場合作成しているグループは、情報に関連している場合、Active Recordのコールバックの詳細については

after_create :create_group 

def create_group 
    # whatever logic and create group 
end 

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

を参照してください。彼は道彼は、私は、ユーザーモデルでのActive Recordのコールバックを作成します作成されますフォーム(ビュー)に入力され、ユーザーと直接関係していない場合は、コントローラーでグループを作成する必要があります。

def create 
    @group = Group.build(params[:group]) 
    @group.save! 
    @user = User.build(params[:user]) 
    @user.group_id = @group.id 
    @user.save! 
end 

または、きれいな方法:

def create 
    @group = Group.build(params[:group]) 
    @group.save! 
    @user = @group.users.build(params[:user]) 
    @user.save! 
end 
+0

はい、 'User'は、単一の' Group'に属することができますので、 'Membership'アソシエーションモデルの余分な抽象化は次のようになりますような何か不必要(私もそれを考慮していなかったが、感謝)。 – oflannabhra

+1

また、私が正しく理解していることを確認するだけです: 'User#create'で' Group'を作成した例では、割り当ての必要はありませんか?つまり、 '@user.group_id = @ group.id'のような何かをする必要はありませんか? – oflannabhra

+0

@oflannabhraはい、あなたはする必要があります。 '@ group.users.build(params [:user])'のようなことをしない限り。私は両方のシナリオで自分の答えを更新しました。 –

関連する問題