Розуміння асоціацій belongs_to та has_many у Rails

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

Асоціація belongs_to

Асоціація belongs_to використовується для встановлення зв'язку один до одного з іншою моделлю. Це означає, що модель, яка містить декларацію belongs_to, має зовнішній ключ.

Приклад: Припустимо, що у нас є дві моделі: Post і Author. Кожен пост належить одному автору.

class Post < ApplicationRecord  
 belongs_to :author  
end  

class Author < ApplicationRecord  
 has_many :posts  
end

У цьому прикладі таблиця posts матиме стовпець author_id, який служить зовнішнім ключем, зв'язуючи кожен пост з автором.

Асоціація has_many

Асоціація has_many використовується для встановлення зв'язку один до багатьох з іншою моделлю. Це означає, що модель, яка містить декларацію has_many, може мати нуль або більше асоційованих записів в іншій моделі.

Приклад: Продовжуючи приклад з моделями Post і Author, один автор може написати багато постів.

class Author < ApplicationRecord  
 has_many :posts  
end  

class Post < ApplicationRecord  
 belongs_to :author  
end

Тут модель Author оголошує асоціацію has_many :posts, що означає, що кожен автор може мати кілька постів.

Схема бази даних

Щоб ці асоціації працювали, схема бази даних повинна відображати ці взаємозв'язки. Таблиця posts повинна мати стовпець author_id:

create_table :authors do |t|  
 t.string :name  
 t.timestamps  
end  

create_table :posts do |t|  
 t.string :title  
 t.text :body  
 t.references :author, foreign_key: true  
 t.timestamps  
end

Використання

З цими асоціаціями ви можете легко переміщатися між моделями. Наприклад:

Щоб знайти всі пости певного автора:

author = Author.find(1)  
posts = author.posts

Щоб знайти автора конкретного поста:

post = Post.find(1)  
author = post.author

Висновок

belongs_to та has_many є основними для моделювання взаємозв'язків у Rails додатках. Вони спрощують процес зв'язування моделей та керування пов'язаними даними. Розуміючи та використовуючи ці асоціації, ви можете створювати потужні та ефективні додатки з добре структурованими базами даних.

Перекладено з: Understanding belongsto and hasmany in Rails

Leave a Reply

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