Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 根据第一个表的ID在多个表中添加一条记录_Ruby_Ruby On Rails 3_Activerecord_Model_Controller - Fatal编程技术网

Ruby 根据第一个表的ID在多个表中添加一条记录

Ruby 根据第一个表的ID在多个表中添加一条记录,ruby,ruby-on-rails-3,activerecord,model,controller,Ruby,Ruby On Rails 3,Activerecord,Model,Controller,伙计们,我有3张桌子,如下所示: 项目{id,名称,所有者,…} 项目里程碑{id,project_id,name…} 用户项目{id,project_id,…} 在这里,创建一个新项目后,我将获取项目ID(@@IDENTITY)列,并使用此ID在项目里程碑和用户项目表中创建一个新行。我的代码如下所示 def create ActiveRecord::Base.transaction do # Instantiate a new object using form param

伙计们,我有3张桌子,如下所示:

  • 项目{id,名称,所有者,…}
  • 项目里程碑{id,project_id,name…}
  • 用户项目{id,project_id,…}
在这里,创建一个新项目后,我将获取项目ID(@@IDENTITY)列,并使用此ID在项目里程碑用户项目表中创建一个新行。我的代码如下所示

def create
    ActiveRecord::Base.transaction do
    # Instantiate a new object using form parameters
      @project = Project.new(params[:project])
      if @project.save
        # if project saves, Create a new insteance into User Projects
        @userproject=UserProject.new(
        :project_id=>@project.id
        )
        @userproject.save

        # Create a new insteance into ProjectMilestone
        @projectmilestone=ProjectMilestone.new(
        :project_id=>@project.id,
        :milestone_id=>12,
        :milestone_date=>@project.created_at
        )
        @projectmilestone.save
        flash[:notice] = "A new project has been created successfully"
        redirect_to(:action => 'list')
      else
      # If save fails, redisplay the form so user can fix problems
        render('new')
      end
    end
  end

这对我来说很好。我想知道是否有任何优化的方法可用于此?因此,我可以将业务逻辑移动到模型中,并让Project创建所有关联的记录,否则将失败。如果您总是希望在创建新项目后创建新的UserProject和新的ProjectMilestone,则可以使用其中一个ActiveRecord回调

在项目模型中,可以添加以下回调:

after_create :create_other_models
现在,您可以在“创建其他模型”方法中复制用于创建其他模型的零件