Кто-нибудь знает другой способ создать миграцию таблицы соединений и указать конкретное имя столбцов ссылок в таблице соединений?

#ruby-on-rails #ruby #activerecord

#ruby-on-rails #ruby #activerecord

Вопрос:

У меня есть эти две модели:

  module Studying
  class Student < ApplicationRecord
   has_and_belongs_to_many :instructors,
                        class_name: 'Studying::Instructor',
                        foreign_key: 'studying_student_id',
                        association_foreign_key: 'studying_instructor_id'
  end
end


 module Studying
  class Instructor < ApplicationRecord
   has_and_belongs_to_many :students,
                        class_name: 'Studying::Student',
                        foreign_key: 'studying_instructor_id',
                        association_foreign_key: 'studying_student_id'
  end
end
  

И для join_table я сгенерировал миграцию:

 def change
  create_table :studying_instructors_students, id: false do |t|
  t.belongs_to :studying_instructor, index: { name: 'index_instructors_students_on_studying_instructor_id' }
  t.belongs_to :studying_student, index: { name: 'index_instructors_students_on_studying_student_id' }
  end
end
  

Итак, все работает нормально, но дело в том, что мой старший товарищ говорит мне, что я не должен использовать в моделях такие вещи, как:

   foreign_key:  'studying_instructor_id',
  

и

   association_foreign_key: 'studying_student_id'  
  

но вместо этого я должен использовать:

   foreign_key:  'instructor_id', 
  

и

   association_foreign_key: 'student_id'
  

и таким же образом в первой модели, потому что это противоречит соглашению.
Я не знаю, как я могу это сделать в этих моделях и в таблицах (как вы уже понимаете имена таблиц в db: studying_instructors и studying_students).

Пожалуйста, какие-нибудь советы?

Комментарии:

1. Спасибо Мартин Эванс, который проверил мое правописание!

Ответ №1:

Вы можете создать таблицу отношений таким образом

 def change
  create_table :studying_instructors_students, id: false do |t|
    t.integer :instructor_id, index: true
    t.integer :student_id, index: true
  end
end
  

и затем вы можете использовать foreign_key: 'instructor_id', и association_foreign_key: 'student_id'

Если я ошибаюсь, пожалуйста, не стесняйтесь задавать дополнительные вопросы.

Комментарии:

1. Спасибо! это работает идеально. решение выглядит простым ))

Ответ №2:

Я бы сделал что-то вроде этого:

 class Studying::Student < ApplicationRecord
  has_many :student_instructors, class_name: 'Studying::StudentInstructor'
  has_many :instructors, through: :student_instructors, class_name: 'Studying::Instructor'

end

class Studying::Instructor < ApplicationRecord
  has_many :student_instructors, class_name: 'Studying::StudentInstructor'
  has_many :students, through: :student_instructors, class_name: 'Studying::Instructor'      
end

class Studying::StudentInstructor < ApplicationRecord
  belongs_to :student, class_name: 'Studying::Student'
  belongs_to :instructor, class_name: 'Studying::Instructor'      
end
  

У меня здесь три таблицы. Один для студентов, второй для преподавателей, а третий — таблица соединений (student_instructors).

Миграция для studnt_instructor будет выглядеть примерно так

 def change
  create_table :student_instuctors, id: false do |t|
    t.integer :instructor_id, index: true
    t.integer :student_id, index: true
  end
end
  

Я не проверял синтаксис, но это скорее логическое объяснение.

Надеюсь, это поможет.