Вывод только опубликованных статей
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)
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
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт
Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу