2011-12-07 51 views
1

因此,我有两个模型:UserGroup在创建单独模型期间创建模型的Rails最佳实践

User belongs_to :group

Group has_many :users

创建新的User时,我想检查已创建的Group并分配它们,或者根据用户提供的信息创建新的GroupGroup.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只是将两者链接起来?

对不起,我明显缺乏对关联的理解,但我试图不只是一起攻击一些笨拙的工作,并且要确保我理解了解决这个问题的最佳方法。

回答

1

首先,根据你写的内容,一个组可以有多个用户,但一个用户只能是单个组的一部分。

通常,一个组可以有多个成员,并且一个用户可以是多个组的成员。为了实现这一点,您需要创建一个名为membership的关联模型。

所以,你的用户模型有:

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

和你的小组模式有:

has_many :memberships 
has_many :members, :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 

要回答你的原始问题,如果你不得不创建一个用户组时创建一个组他的方式,他创建的,我会在用户模型创建活动记录的回调:

after_create :create_group 

def create_group 
    # whatever logic and create group 
end 

有关的Active Record回调的更多信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

如果你正在创建的组相关信息以表单(视图)输入并且与用户没有直接关系,那么您必须在控制器中创建组。喜欢的东西:

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

此外,为了确保我理解正确:在你创建'用户#创建''Group'的示例中,不需要赋值?也就是说,我不需要像'@ user.group_id = @ group.id'那样做一些事情? – oflannabhra

+0

@oflannabhra是的,你将不得不。除非你做'@ group.users.build(params [:user])''。我更新了两种情况下的答案。 –