текст перекладу
В Ruby on Rails асоціації використовуються для налаштування взаємозв'язків між моделями Active Record, що дозволяє вам легко запитувати та маніпулювати даними у вашій базі даних. Ці асоціації надають методи для керування взаємозв'язками, що робить роботу з пов'язаними моделями набагато простішою.
Типи асоціацій у Rails
Rails підтримує шість типів асоціацій:
- Один до одного (has_one)
- Один до багатьох (hasmany і belongsto)
- Багато до багатьох (hasandbelongstomany або has_many :through)
1. Один до одного (has_one)
Один до одного означає, що одна модель пов'язана з однією іншою моделлю.
Приклад:
User
має одинProfile
class User < ApplicationRecord
has_one :profile
end
class Profile < ApplicationRecord
belongs_to :user
end
user = User.create(name: "Alice")
profile = Profile.create(bio: "Software Engineer", user: user)
user.profile # => Повертає пов'язаний профіль
profile.user # => Повертає пов'язаного користувача
Один до одного (Один користувач — один профіль)
2. Один до багатьох (hasmany і belongsto)
Один до багатьох означає, що одна модель пов'язана з багатьма іншими моделями.
Приклад:
User
має багатоPosts
class User < ApplicationRecord
has_many :posts
end
class Post < ApplicationRecord
belongs_to :user
end
user = User.create(name: "Bob")
post1 = Post.create(title: "First Post", user: user)
post2 = Post.create(title: "Second Post", user: user)
user.posts # => Повертає всі пости для користувача
post1.user # => Повертає пов'язаного користувача
Один до багатьох (Один користувач — багато постів)
3. Багато до багатьох
a. Використовуючи has_and_belongs_to_many
Багато до багатьох — це коли обидві моделі можуть безпосередньо взаємодіяти одна з одною.
Приклад:
Student
може мати багатоCourses
, аCourse
може мати багатоStudents
.
class Student < ApplicationRecord
has_and_belongs_to_many :courses
end
class Course < ApplicationRecord
has_and_belongs_to_many :students
end
student = Student.create(name: "John")
course = Course.create(name: "Mathematics")
student.courses << course
student.courses # => Повертає всі курси, пов'язані з учнем
course.students # => Повертає всіх студентів, пов'язаних з курсом
Багато до багатьох (Студенти та курси)
b. Використовуючи has_many :through
Це більш розширена форма багато до багатьох, що дозволяє використовувати модель з'єднання з додатковими атрибутами.
Приклад:
Doctor
має багатоAppointments
, аAppointment
належить одномуPatient
.
hasmany :through_
class Doctor < ApplicationRecord
has_many :appointments
has_many :patients, through: :appointments
end
class Patient < ApplicationRecord
has_many :appointments
has_many :doctors, through: :appointments
end
class Appointment < ApplicationRecord
belongs_to :doctor
belongs_to :patient
end
doctor = Doctor.create(name: "Dr. Smith")
patient = Patient.create(name: "Mary")
appointment = Appointment.create(doctor: doctor, patient: patient, date: "2025-01-21")
doctor.patients # => Повертає всіх пацієнтів для лікаря
patient.doctors # => Повертає всіх лікарів для пацієнта
- Використовуйте
has_one
для відносин один до одного. - Використовуйте
has_many
таbelongs_to
для відносин один до багатьох. - Використовуйте
has_and_belongs_to_many
для простіших відносин багато до багатьох. - Використовуйте
has_many :through
для складних відносин багато до багатьох з додатковими даними у моделі з'єднання.
Перекладено з: Unveiling the Secret Love Affairs of Rails Models: All About Associations and Their Scandalous Tables!