我有一个学生资料页面。该页面上有一个表单,允许您为该学生创建新的Note
记录。效果很好。
我想在标记为“Who?”的“Note”文本字段上方添加一个新字段。这允许您输入其他学生,从而批量记录笔记:
我不太确定如何构建我的表单和控制器操作来实现批量创建与列出的每个学生相关联的新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并手动修改参数?
答案 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 %>