Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Связи Основы разработки на Ruby on Rails

Программа урока

  • Работа со скоупами
  • Типы связей в Rails
  • Возможности связей в Rails
  • Связи + Simple Form

Скоупы

Вывод только опубликованных статей

Article.where(published: true).order(created_at: :desc)

models/article.rb

  # scope создаст метод для выборки. Article.published.all выберет все опубликованные статьи
  scope :published, -> { where(published: true) }
  # def self.published
  #   where(published: true)
  # end

  scope :by_creation_date_desc, -> { order(created_at: :desc) }
  scope :by_creation_date_asc, -> { order(created_at: :asc) }

Теперь можно использовать скоупы:

Article.published.by_creation_date_desc

Связи

Подготовка:

# Удаление колонки автор из таблицы
bin/rails g migration remove_author_from_articles
bin/rails db:migrate

Миграция:

class RemoveAuthorFromArticles < ActiveRecord::Migration[6.1]
  def change
    remove_column :articles, :author
  end
end
# Добавление модели автор
bin/rails g model author name
bin/rails db:migrate

models/article.rb

class Article < ApplicationRecord
  belongs_to :author
end
# После добавления belongs_to :author в Article
# Сработает соглашение об наименованиях
bin/rails g migration add_author_to_articles author:references

Обращение к автору, создание автора для статьи:

# https://guides.rubyonrails.org/association_basics.html#the-belongs-to-association
article.author

Article.delete_all

article = Article.new

article.author # nil

author = article.build_author
# <Author:0x000055d15f486e18 id: nil, name: nil, created_at: nil, updated_at: nil>

Форма создания статьи с автором:

= simple_form_for article do |f|
  = f.input :title
  = f.input :body
  = f.input :published
  # В таком виде заполняются поля для связанной модели
  = f.association :author do |a|
    = a.input :name
  # Будет созданы радио с выбором авторов
  # = f.association :author, as: :radio_buttons
  # Будет создан select с выбором модели
  # = f.association :author
  = f.button :submit

Создание автора в контроллере:

def create
  author = Author.create(author_params)
  @article = Article.new(article_params)
  @article.author = author
  ...
end
def author_params
  params.require(:article).require(:author).permit(:name)
end

models/author.rb

class Author < ApplicationRecord
  # один к одному:
  # has_one: article

  # один ко многим
  has_many :articles

  # много ко многим
  # has_and_belongs_to_many :articles
end
# one-to-many
author.articles # Article::ActiveRecord_Associations_CollectionProxy
# Забрать определенные поля
author.articles.pluck(:title)
author.articles.pluck(:title, :id)

Пример связи has_many_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: 'Fred')
patient = Patient.create(name: 'Alice')
appointment = Appointment.create(doctor: doctor, patient: patient, appointment_date: Time.now.tomorrow)

appointment.doctor # Doctor name: 'Fred'
appointment.patient # Doctor name: 'Alice'

doctor.patients.pluck(:name) # ["Alice"]

Создание связанной модели

article = Article.new
author = article.build_author(name: 'Bob')

author = Author.find(1)

article = author.articles.build(title: 'Article 1', body: "Article body") # аналог Article.new

author.save # сохраняет основную и связанные модели

# При создании таблицы m2m связи имена моделей должны быть в алфавитном порядке (соглашение о наименовании)
class CreateArticlesAuthors < ActiveRecord::Migration[6.1]
  def change
    create_table :articles_authors, id: false do |t|
      t.belongs_to :articles
      t.belongs_to :authors
      t.timestamps
    end
  end
end

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Разработчик на Ruby on Rails
Профессия
c опытом
Создание веб-приложений со скоростью света
2 февраля 5 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу