在has_one最佳实践建议中使用子类来构建build_association

时间:2012-04-27 11:06:14

标签: ruby-on-rails-3 activerecord

我有一个像这样定义的User类

class User
end

我已经将其转换为创建所有者类并与另一个公司类创建了一个has_one关系

class Owner < User
  has_one :company
end

class Company
  belongs_to :owner
end

在我的用户控制器中创建新用户时,我想完成以下任务:

  1. 创建新用户
  2. 创建新公司
  3. 将用户与公司关联(作为所有者,即company.owner_id)
  4. 我可以使用以下代码完成此操作(简化为简洁)

    def create
      @user = User.new(params[:user])
      @company = Company.new(params[:company])
    
      if @user.save
        @company.owner_id = @user.id
        @company.save
        ...
    

    现在,这对我来说感觉很难看,但我似乎无法使整个build_asociation过程按预期工作(是的,开发和测试都有字段)。

    我应该在这做什么?

1 个答案:

答案 0 :(得分:0)

如果您需要同时创建OwnerCompany,建议您在accepts_nested_attributes_for中使用Owner。这是代码:

class Owner < User
  has_one :company
  accepts_nested_attributes_for :company
end

然后在您的控制器中,您可以执行以下操作:

def create
  @user = User.new(params[:user]) # should it be User or Owner?
  @user.company_attributes = params[:company] # assume two separate forms for User and Company
  # if you use fields_for, however, company attributes are nested under params[:user] automatically.

  if @user.save
    # do your job here
  end
end

如需完整参考,请查看Active Record Nested Attributes和视图帮助fields_for