使用has_many:through转换has_many和:belongs_to

时间:2010-08-09 17:05:05

标签: ruby-on-rails has-many-through

我目前有一个协会:

Group :has_many EmployeesEmployee :belongs_to Group

但现在我希望员工也与许多群组相关联。

为此,我正在考虑制作:

groupizations group_id:integer employee_id:integer created_at:datetime

这将改变员工和集团模式:

class Groupizations < ActiveRecord::Base
   belongs_to  :employee
   belongs_to  :group
end

class Group < ActiveRecord::Base
   has_many    :groupizations
   has_many    :employees, :through => categorizaitons
end

class Employee < ActiveRecord::Base
   has_many    :groupizations
   has_many    :groups, :through => categorizaitons
end

我从多对多的railscasts episode了解所有这些。我唯一困惑的是,现在我用以下代码创建一个新的Employee:

  def create
    @employee = Employee.new(params[:employee])
    if @employee.save
      flash[:notice] = "Successfully created employee."
      redirect_to @employee
    else
      render :action => 'new'
    end
  end

这段代码将如何变化?我是否需要同时将数据添加到groupizations

1 个答案:

答案 0 :(得分:1)

如果您想将员工添加到组,您只需要执行以下操作:

@employee.groups << @group

您自己创建的Groupization记录将自动创建。如果你想在关联中放入一些元数据,这在你想要指定这种关系的本质时很常见,你可以做一些更正式的事情:

@employee.groupizations.create(
  :group => group,
  :badge_number => 'F920'
)

由于连接模型通常在两个ID列上具有唯一索引,因此请务必避免插入重复记录时可能发生的错误。根据您的后端数据库,这些看起来不同,因此请进行相应的测试。您可以根据需要使用find_or_create