单表中的多个外键不生成

时间:2012-12-17 19:13:27

标签: ruby-on-rails associations

我有一个设置,当用户创建新项目时,他们默认情况下必须创建一个属于项目的新团队(一对一)和一个属于团队的新角色(多对一) )。一切都按预期工作,除了我还希望创建项目的人与第一个角色绑定。

因此,角色有两个外键(team_id和user_id)。我似乎无法让user_id像team_id那样填充。这是代码:

class ProjectsController < ApplicationController
  before_filter :signed_in_user, only: [:show, :edit, :update, :destroy]
  before_filter :correct_or_admin_user,  only: [:edit, :update, :destroy]


  def new
    @user = current_user
    @project = Project.new
    @team = @project.build_team
    @user.roles.build 
    @team.roles.build
  end

  def create
    @project = current_user.projects.new(params[:project])

    if @project.save
      flash[:success] = "Your new project has been created!"
      redirect_to @project
    else
      render 'new'
    end
  end

该行&#34; current_user.roles.build有什么问题吗?我不明白为什么@ team.roles.build正在工作但不是另一条线。

2 个答案:

答案 0 :(得分:0)

http://guides.rubyonrails.org/association_basics.html#has_many-when_are_objects_saved

我在这里看到两个问题:

  1. build不保存创建的对象。当团队得到保存时(当rails知道团队的id是什么时,它可以设置外键),您与新团队的关联构建的角色会被保存。同样,当新项目保存时,团队会得到保存。因此,当您保存项目时,所有这些都会发生。但是,您不会做任何会导致您在保存用户关联的情况下构建的角色。

  2. 即使您使用create(保存新的关联记录),即@user.roles.create,您也不会得到我认为您想要的东西,因为您将成为创建与Role获得的对象不同的@team.roles.build对象。

  3. 以下内容可以解决这两个问题。

    @team.roles << @user.roles.build
    

答案 1 :(得分:0)

我能够用'@ team.roles&lt;&lt;来弄清楚你得到了什么。 @ user.roles.build”。我无法使用@ team.roles,因为据我所知,此实例的范围仅限于新功能。此外键的创建也必须在create中进行,因为直到项目保存后才会生成角色。

我最终做的是在if @ project.save行后面的create方法中添加了以下内容:

          current_user.roles << @project.team.roles(params[:project])

然后我完全删除了@ user.roles.build。来自http://guides.rubyonrails.org/association_basics.html#has_many-association-reference的第4.3.1.2节是我最终点击的所有内容。