Розкриття таємних любовних інтриг моделей Rails: все про асоціації та їхні скандальні таблиці!

текст перекладу
В Ruby on Rails асоціації використовуються для налаштування взаємозв'язків між моделями Active Record, що дозволяє вам легко запитувати та маніпулювати даними у вашій базі даних. Ці асоціації надають методи для керування взаємозв'язками, що робить роботу з пов'язаними моделями набагато простішою.

Типи асоціацій у Rails

Rails підтримує шість типів асоціацій:

  1. Один до одного (has_one)
  2. Один до багатьох (hasmany і belongsto)
  3. Багато до багатьох (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 # => Повертає пов'язаного користувача

pic

Один до одного (Один користувач — один профіль)

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 # => Повертає пов'язаного користувача

pic

Один до багатьох (Один користувач — багато постів)

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 # => Повертає всіх студентів, пов'язаних з курсом

pic

Багато до багатьох (Студенти та курси)

b. Використовуючи has_many :through

Це більш розширена форма багато до багатьох, що дозволяє використовувати модель з'єднання з додатковими атрибутами.

Приклад:

  • Doctor має багато Appointments, а Appointment належить одному Patient.

pic

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 # => Повертає всіх лікарів для пацієнта

pic

  • Використовуйте 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!

Leave a Reply

Your email address will not be published. Required fields are marked *