如何在单个控制器操作中创建多个新记录?

时间:2015-12-31 21:49:26

标签: ruby-on-rails

我有一个学生资料页面。该页面上有一个表单,允许您为该学生创建新的Note记录。效果很好。

enter image description here

我想在标记为“Who?”的“Note”文本字段上方添加一个新字段。这允许您输入其他学生,从而批量记录笔记:

enter image description here

我不太确定如何构建我的表单和控制器操作来实现批量创建与列出的每个学生相关联的新Note记录。

我正在考虑采用这种方法:

POST对同一操作(/notes#create)并检测student_ids中数组字段params的存在,然后执行以下操作:

params[:student_ids].each do |s|
  note_params[:event_attributes][:student_id] = s
  note = Note.new(note_params)
  note.save
end

但是我必须修改note_params,以便它在每次迭代时包含正确的student_id引用。

目前,在单数形式上,note_params看起来像这样:

=> {
           "content" => "test",
  "event_attributes" => {
           "student_id" => "2",
               "user_id" => "1",
          "is_milestone" => "0",
    "happened_at_string" => ""
  }
}

是否有更好/更清洁/更简单的方法来执行此操作而无需遍历每个ID并手动修改参数?

2 个答案:

答案 0 :(得分:1)

你不需要那样修改params。

params.fetch(:student_ids, []).each do |student_id|
  student = Student.find(student_id)
  note = student.notes.new(note_params)
  note.save
end

答案 1 :(得分:1)

我认为你最好为这个功能创建一些连接表。

这样,您可以创建一个注释,然后通过简单地复制连接记录来“复制”它。缺点是多个人可以访问一个注释,但这没关系:

#app/models/student.rb
class Student < ActiveRecord::Base
   has_many :created_notes, class_name: "Note", foreign_key: :user_id
   has_and_belongs_to_many :notes
end

#app/models/note.rb
class Note < ActiveRecord::Base
   belongs_to :user #-> to know who made it
   has_and_belongs_to :users
end

然后您可以按照以下方式使用notes#create方法:

#app/controllers/notes_controller.rb
class NotesController < ApplicationController
   def new
      @note  = current_user.created_notes.new
      @users = User.where.not(id: current_user.id)
   end

   def create
      @note = current_user.created_notes.new note_params
      @note.save
   end

   private

   def note_params
      params.require(:note).permit(:body, :user_ids)
   end
end

因此,您将能够使用collection_select(或类似)功能为user_ids定义note

#app/views/notes/new.html.erb
<%= form_for @note do |f| %>
   <%= f.collection_select :user_ids, @users, :id, :name %>
   <%= f.submit %>
<% end %>