Как сделать модельные ассоциации между двумя моделями в Ruby. Или Как взять данные из одной модели и использовать их в другой модели?
Поэтому я создаю две модели, одну "Курс" и одну "Секцию" с каркасом, и мне нужно, чтобы Раздел отображал Курсы в раскрывающемся меню, которое отражает все курсы, которые были созданы в модели курса, и использую его для создания в разделе. Мне удалось открыть выпадающее меню, в котором отображаются курсы, созданные из "Курса", но при создании нового раздела курс отображается пустым. Курс имеет название, отдел, номер и кредитные часы. Раздел содержит семестр, номер, курс и номер комнаты.
То, что я изменил, чтобы сделать выпадающее меню было (в _form.html.erb просмотров раздела)
<div class="field">
<%= form.label "Courses", class: 'courses'%>
<%= form.collection_select(:section, Course.all, :id, :name) %>
</div>
Это дает ошибку "Курсы должны существовать"
Ранее у меня было:
<div class="field">
<%= form.label "Courses", class: 'courses'%>
<%= form.collection_select(:course_ids, Course.all, :id, :name) %>
Это не дало ошибку и позволило мне создать раздел, просто не добавляя выбранный курс в базу данных раздела.
https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html
Из прочтения видно: имя должно быть определено в части курса курса, но когда я пытаюсь это сделать, выдает ошибку. Я также понимаю, что мне не нужно записывать курс с определенным идентификатором раздела, поэтому он не сохраняет его при создании нового раздела. Мой вопрос: что я могу добавить или изменить, чтобы это работало? Использование коллекции выбрать не то, что нужно сделать?
РЕДАКТИРОВАТЬ, чтобы включить section_controller.rb
class SectionsController < ApplicationController
before_action :set_section, only: [:show, :edit, :update, :destroy]
# GET /sections
# GET /sections.json
def index
@sections = Section.all
end
# GET /sections/1
# GET /sections/1.json
def show
end
# GET /sections/new
def new
@section = Section.new
end
# GET /sections/1/edit
def edit
end
# POST /sections
# POST /sections.json
def create
@section = Section.new(section_params)
respond_to do |format|
if @section.save
format.html { redirect_to @section, notice: 'Section was successfully created.' }
format.json { render :show, status: :created, location: @section }
else
format.html { render :new }
format.json { render json: @section.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /sections/1
# PATCH/PUT /sections/1.json
def update
respond_to do |format|
if @section.update(section_params)
format.html { redirect_to @section, notice: 'Section was successfully updated.' }
format.json { render :show, status: :ok, location: @section }
else
format.html { render :edit }
format.json { render json: @section.errors, status: :unprocessable_entity }
end
end
end
# DELETE /sections/1
# DELETE /sections/1.json
def destroy
@section.destroy
respond_to do |format|
format.html { redirect_to sections_url, notice: 'Section was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_section
@section = Section.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def section_params
params.require(:section).permit(:semester, :number, :course, :room_number)
end
end
Я считаю, что мне нужно как-то связать их с последней частью:
def section_params
params.require(:section).permit(:semester, :number, :course, :room_number)
РЕДАКТИРОВАТЬ: http://rubyisonrails.com/pictures/part1.PNG http://rubyisonrails.com/pictures/part2.PNG ">
1 ответ
Во-первых, вы должны изменить courses
в course
в Section
модель. Название ассоциации для belongs_to
всегда должен быть единичным
class Section < ApplicationRecord
belongs_to :course #singular name
end
Во-вторых, у вас должен быть столбец course_id вместо курса в таблице разделов. Вы можете создать миграцию, которая будет отражать эти изменения в таблице
rails g migration modify_sections
Приведенная выше команда должна сгенерировать файл как xxxxxxxmodify_sections.rb
под db/migrate
папка. Откройте файл и добавьте
def change
add_column :sections, :course_id, :integer
remove_column :sections, :course, :integer
end
и делать rake db:migrate
Теперь измените collection_select
как ниже
<%= form.collection_select(:course_id, Course.all, :id, :name) %>
И в sections_controller#create
, добавлять
@section.course_id = params[:section][:course_id]
перед respond_to do |format|
Наконец, изменить course
в course_id
в section_params
метод.
def section_params
params.require(:section).permit(:semester, :number, :course_id, :room_number)
end
Замечания:
Поскольку вы очень плохо знакомы с этой технологией, я рекомендую вам следовать Руководствам для изучения.