#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
Я не проверял синтаксис, но это скорее логическое объяснение.
Надеюсь, это поможет.