RAILS 6 has_and_belongs_to_many >> join_table << не работает - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу использовать join_table между двумя отношениями многие ко многим.

ученик -> join_table <- учитель </strong>

Определение модели:

class Student < ApplicationRecord
    has_and_belongs_to_many :teachers, join_table: map_student_teacher
end

class Teacher < ApplicationRecord
    has_and_belongs_to_many :students, join_table: map_student_teacher
end

Определение миграции:

class CreateStudents < ActiveRecord::Migration[6.0]
  def change
    create_table :students do |t|
      t.string : student_name
    end
  end
end

class CreateTeachers < ActiveRecord::Migration[6.0]
  def change
     create_table :teachers do |t|
       t.string : teacher_name
     end
  end
end


class CreateStudentsTeachersJoinTable < ActiveRecord::Migration[6.0]
  def change
     create_table :map_student_teacher, id: false do |t|
       t.belongs_to :student, index: true
       t.belongs_to :teacher, index: true
    end
  end
end

Сейчас У меня есть файл seed.rb для инициализации имен учеников.

students_defaults = ["hans","otto","paul","elsa"]

students_defaults.each do |name|
  Student.create(student_name: name) 
end

Когда я загружаю семя по rails db:seed, я получаю это сообщение об ошибке:

rails aborted!
NameError: undefined local variable or method `map_student_teacher' for Student (call 'Student.connection' to establish a connection):Class
/home/sven/.rvm/gems/ruby-2.5.3/gems/activerecord-6.0.2.2/lib/active_record/dynamic_matchers.rb:22:in `method_missing'

Что происходит не так?

1 Ответ

2 голосов
/ 01 апреля 2020

В ваших модельных классах должно быть написано join_table: :map_student_teacher. Обратите внимание на лишнее двоеточие, чтобы преобразовать map_student_teacher в символ. Без этого Ruby пытается заглянуть внутрь локального файла map_student_teacher, который не определен.

class Student < ApplicationRecord
    has_and_belongs_to_many :teachers, join_table: :map_student_teacher
end

class Teacher < ApplicationRecord
    has_and_belongs_to_many :students, join_table: :map_student_teacher
end

Если вам это некрасиво, вы также можете использовать более старый синтаксис :join_table => :map_student_teacher.

...