2016-01-25 53 views
3

我试图通过创建操作在联接表中创建多个记录。这是我的协会。Rails在联接表中创建多个记录

class User 
    has_many :abilities 
    has_many :skills, through: :abilities 
end 

class Job 
    has_many :abilities 
    has_many :skills, through: :abilities 
end 

class Ability 
    belongs_to :job 
    belongs_to :skill 
end 

我有一个表单来创建一个新的工作。有一个选择框可以选择工作所需的技能(技能已经创建)。在jobs_controller.rb的创建动作中,如何创建多个技能?这是我的。

def create 
    @job = Job.new(job_params) 
    @abilities = @job.abilities.build(params[:job][:skills]) 
end 

我的params返回一个技能数组。

"job"=> { 
    "name"=>"abc", 
    "skills"=>["2", "5"] 
} 

陷入如何在我的jobs_controller的创建操作创建两个能力记录(和关联正在创建的gig_id到演出)。

+0

您的技能模型在哪里?技能和能力相同吗?如果不是,那么为什么你需要能力和技能(他们的角色)? –

+0

这是一个多对多的关联。 – leejay100

回答

1

可以使用singular_collection_ids方法为此:

#app/controllers/jobs_controller.rb 
class JobsController < ApplicationController 
    def new 
     @job = Job.new 
     @skills = Skill.all 
    end 

    def create 
     @job = Job.new job_params 
     @job.save 
    end 

    private 

    def job_params 
     params.require(:job).permit(skill_ids: []) 
    end 
end 

#app/views/jobs/new.html.erb 
<%= form_for @job do |f| %> 
    <%= f.collection_select :skill_ids, @skills, :id, :name %> 
    <%= f.submit %> 
<% end %> 

话虽如此,你有一个重大的结构性问题。您需要用Skill替换User

#app/models/skill.rb 
class Skill < ActiveRecord::Base 
    has_many :abilities 
    has_many :jobs, through: :abilities 
end 

#app/models/ability.rb 
class Ability < ActiveRecord::Base 
    belongs_to :job 
    belongs_to :skill 
end 

#app/models/job.rb 
class Job < ActiveRecord::Base 
    has_many :abilities 
    has_many :skills, through: :abilities 
end 
+0

太棒了,就是这样。谢谢Rich。 – leejay100

+0

没问题,谢谢你花时间去浏览它! –

1

做到这一点的最简单了的方法是从形式发送“skill_ids”

"job"=> { 
     "name"=>"abc", 
     "skill_ids"=>["", "2", "5"] 
     } 

在控制器

def create 
    @job = Job.new(job_params) 
    # ... 
end 

def job_params 
    params.require(:job).permit([:name, skill_ids: []]) 
end 

需要的能力将被自动创建