Rails在创建单独模型期间创建模型的最佳实践

时间:2011-12-07 16:27:08

标签: ruby-on-rails ruby-on-rails-3 model associations

所以,我有两个模型:UserGroup

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 个答案:

答案 0 :(得分: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

要回答原始问题,如果您在创建用户时必须创建一个组而不管他是如何创建的,我会在用户模型中创建一个Active Record Callback:

after_create :create_group

def create_group
   # whatever logic and create group
end

有关Active Record Callbacks的更多信息,请参阅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