Как сделать модельные ассоциации между двумя моделями в 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

Замечания:

Поскольку вы очень плохо знакомы с этой технологией, я рекомендую вам следовать Руководствам для изучения.

Другие вопросы по тегам