Как создать отношение один ко многим между моделями в Ruby on Rails? - PullRequest
1 голос
/ 05 октября 2019

У меня есть студенты и курсы в моих моделях и контроллерах ruby, поэтому я хочу соединить эти две вещи, показать пользователя и курсы, которые он зарегистрировал, и щелкнуть эти курсы, чтобы увидеть, что находится внутри этого курса. Я новичок в ruby, поэтому я не знаю много о has_many и не могу найти что-то, что может сделать то, что я хочу работать

Я использую скаффолд для создания моделей и контроллеров, у пользователя есть только имя,электронная почта и курсы имеют только имя_курса

студент:

 create_table :student do |t|
      t.string :name
      t.string :email

курс:

create_table :course do |t|
  t.string :name

  t.timestamps

в индексе студентов я только перечисляю всех студентов, которые у меня есть. Halp PLS

Ответы [ 3 ]

3 голосов
/ 05 октября 2019

Похоже, вы хотите использовать связь «многие ко многим» между students и courses. Есть несколько способов добиться этого. Я бы пошел с опцией has_many :though, описанной здесь , в которой вы добавили бы дополнительную модель под названием StudentCourse.

Таким образом, в вашем сценарии вы должны:

  1. сгенерировать эту модель StudenCourse с помощью rails generate model StudentCourse student:references model:references

  2. добавить следующее кВаша Student модель

    class Student
      ...
      has_many :student_courses
      has_many :courses, through: student_courses
      ...
    end
добавить следующее к вашей Course модели
    class Course
      ...
      has_many :student_courses
      has_many :students, through: student_courses
      ...
    end
запускать миграции с rake db:migrate , теперь вы можете начать добавлять студентов на курсы и наоборот. Например:
    Student.last.courses << Course.last
    Course.first.students << Student.first

и в ваших контроллерах вы можете просто позвонить student.courses, чтобы просмотреть курсы, связанные с данным студентом, или course.students, чтобы просмотреть студентов, проходящих определенный курс.

обратите внимание, как модели Course и Student теперь связаны друг с другом с помощью has_many: ..., through: :student_courses.

Еще одним преимуществом использования этого типа связи «многие ко многим» является гибкость. ,Например, вы можете начать записывать, бросили ли студенты определенные курсы. Вы можете сделать это, просто добавив столбец dropped_at в эту новую таблицу student_courses.

РЕДАКТИРОВАТЬ

добавив несколько более подробных примеров использования этой новой ассоциации:

, как уже упоминалось, вы можете добавлять курсы к студентам и наоборот через консоль rails. Например, студент с идентификатором 1 хочет записаться на курс с идентификатором 2:

Student.find(1).courses << Course.find(2)

аналогично, вы можете просто добавить студентов в курсы следующим образом:

Course.find(2).students << Student.find(1)

под капотом обе эти ассоциации будут создавать новый экземпляр класса StudentCourse, который мы добавили. Таким образом, третий вариант создания этой ассоциации будет:

StudentCourse.create(student: Student.find(1), course: Course.find(2))
3 голосов
/ 06 октября 2019

То, что вы, скорее всего, хотите здесь, на самом деле является ассоциацией многих ко многим. Не один ко многим.

class Student < ApplicationRecord
  has_many :enrollments
  has_many :courses, through: :enrollments
end

class Course < ApplicationRecord
  has_many :enrollments
  has_many :courses, through: :enrollments
end

class Enrollment < ApplicationRecord
  belongs_to :student
  belongs_to :course
end

Это позволяет использовать courses в качестве таблицы нормализации, которая содержит информацию о курсе вместо дублирования ее для каждого студента.

enrollments работаетв качестве таблицы соединений и позволяет присоединить любое количество студентов к любому количеству курсов. Здесь также хранится информация, описывающая отношения между студентом и курсом, например, оценка ученика (оценки).

0 голосов
/ 05 октября 2019

Вам необходимо установить отношения, то есть ассоциации, в ваших модельных классах.

Возможно, у вас уже есть два класса моделей в папке с именем app / models (при условии, что леса создали их):

  • app / models / student.rb
  • app / models / curso.rb

в app / models / student.rb у вас должно быть что-то вроде этого:

class Student < ActiveRecord::Base

  belongs_to :curso

end

в app / models / curso.rb у вас должно быть что-то вроде этого:

class Curso < ActiveRecord::Base

  has_many :students

end

Так создаются ассоциации в рельсах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...