Rails在连接表中创建多个记录

时间:2016-01-25 04:42:51

标签: ruby-on-rails ruby ruby-on-rails-4

我正在尝试通过创建操作在连接表中创建多个记录。这是我的协会。

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

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

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

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

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

如何在我的jobs_controller的创建操作中创建两个Ability记录(并将gig_id与正在创建的工具相关联)。

2 个答案:

答案 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

将自动创建所需的能力

答案 1 :(得分: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 %>

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

#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