0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы познакомимся с моделями в Ruby on Rails. Мы рассмотрим, как модели управляют данными и бизнес-логикой приложения, обеспечивая взаимодействие с базой данных и валидацию данных. Узнаем, как генерировать модели, создавать миграции для управления схемой базы данных и использовать Active Record для выполнения запросов.</p>
1
<p>В этом уроке мы познакомимся с моделями в Ruby on Rails. Мы рассмотрим, как модели управляют данными и бизнес-логикой приложения, обеспечивая взаимодействие с базой данных и валидацию данных. Узнаем, как генерировать модели, создавать миграции для управления схемой базы данных и использовать Active Record для выполнения запросов.</p>
2
<h2>Подготовка</h2>
2
<h2>Подготовка</h2>
3
<p>Для работы Rails с базой данных, необходимо ее подготовить. По умолчанию Rails использует SQLite для работы с БД. Настройки подключения к базе данных хранятся в файле<em>config/database.yml</em></p>
3
<p>Для работы Rails с базой данных, необходимо ее подготовить. По умолчанию Rails использует SQLite для работы с БД. Настройки подключения к базе данных хранятся в файле<em>config/database.yml</em></p>
4
<h2>Что такое модель</h2>
4
<h2>Что такое модель</h2>
5
<p>Модель - это один из трех основных компонентов архитектуры MVC (Model-View-Controller), используемой в Ruby on Rails и других фреймворках. Model отвечает за управление данными, бизнес-логикой и правилами приложения. Модель взаимодействует с базой данных, выполняет операции CRUD (создание, чтение, обновление, удаление) и обеспечивает валидацию данных. Она определяет структуру данных и их взаимосвязи, а также содержит методы для работы с этими данными.</p>
5
<p>Модель - это один из трех основных компонентов архитектуры MVC (Model-View-Controller), используемой в Ruby on Rails и других фреймворках. Model отвечает за управление данными, бизнес-логикой и правилами приложения. Модель взаимодействует с базой данных, выполняет операции CRUD (создание, чтение, обновление, удаление) и обеспечивает валидацию данных. Она определяет структуру данных и их взаимосвязи, а также содержит методы для работы с этими данными.</p>
6
<p>Модели представляют собой абстракцию данных, хранящихся в базе данных. Они определяют, какие данные будут храниться, как они будут структурированы и как будут связаны между собой.</p>
6
<p>Модели представляют собой абстракцию данных, хранящихся в базе данных. Они определяют, какие данные будут храниться, как они будут структурированы и как будут связаны между собой.</p>
7
<p>Связь класса модели с таблицей</p>
7
<p>Связь класса модели с таблицей</p>
8
<p>Модели в Ruby On Rails используют Active Record - встроенный ORM (Object-Relational Mapping) в Rails, который упрощает взаимодействие с базой данных. Active Record позволяет разработчикам выполнять запросы к базе данных, не написав ни одной строки SQL, что делает код более читаемым и поддерживаемым.</p>
8
<p>Модели в Ruby On Rails используют Active Record - встроенный ORM (Object-Relational Mapping) в Rails, который упрощает взаимодействие с базой данных. Active Record позволяет разработчикам выполнять запросы к базе данных, не написав ни одной строки SQL, что делает код более читаемым и поддерживаемым.</p>
9
<h2>Миграции</h2>
9
<h2>Миграции</h2>
10
<p>Если у нас еще нет структуры базы данных, ее необходимо подготовить. Для этого используют миграции. Миграции в Ruby on Rails представляют собой механизм для управления схемой базы данных. Они позволяют разработчикам изменять структуру базы данных с помощью кода, что делает процесс управления схемой более удобным и безопасным. Миграции обеспечивают версионирование изменений в базе данных, позволяя легко откатывать или применять изменения по мере необходимости. Это особенно полезно в командной разработке, где несколько разработчиков могут вносить изменения в базу данных одновременно.</p>
10
<p>Если у нас еще нет структуры базы данных, ее необходимо подготовить. Для этого используют миграции. Миграции в Ruby on Rails представляют собой механизм для управления схемой базы данных. Они позволяют разработчикам изменять структуру базы данных с помощью кода, что делает процесс управления схемой более удобным и безопасным. Миграции обеспечивают версионирование изменений в базе данных, позволяя легко откатывать или применять изменения по мере необходимости. Это особенно полезно в командной разработке, где несколько разработчиков могут вносить изменения в базу данных одновременно.</p>
11
<p>Создадим таблицу пользователей с помощью миграции</p>
11
<p>Создадим таблицу пользователей с помощью миграции</p>
12
<p>Эта команда создаст миграцию<em>/tmp/static_pages_app/db/migrate/xxxxxxxxxxxxxx_create_users.rb</em>. Где<em>xxxxxxxxxxxxxx</em>- это дата создания миграции:</p>
12
<p>Эта команда создаст миграцию<em>/tmp/static_pages_app/db/migrate/xxxxxxxxxxxxxx_create_users.rb</em>. Где<em>xxxxxxxxxxxxxx</em>- это дата создания миграции:</p>
13
<p>Применим миграцию</p>
13
<p>Применим миграцию</p>
14
<p>Проверим, что все было выполнено успешно:</p>
14
<p>Проверим, что все было выполнено успешно:</p>
15
<h2>schema.rb</h2>
15
<h2>schema.rb</h2>
16
<p>После первой миграции будет создан файл<em>db/schema.rb</em>. Он отображает текущую структуру базы данных, включая таблицы, столбцы и индексы. Файл обновляется при создании и применении миграций, позволяет восстанавливать структуру базы данных, синхронизировать ее в командной разработке и служит документацией для разработчиков.</p>
16
<p>После первой миграции будет создан файл<em>db/schema.rb</em>. Он отображает текущую структуру базы данных, включая таблицы, столбцы и индексы. Файл обновляется при создании и применении миграций, позволяет восстанавливать структуру базы данных, синхронизировать ее в командной разработке и служит документацией для разработчиков.</p>
17
<h2>Модели</h2>
17
<h2>Модели</h2>
18
<p>Также, как и контроллеры, модели можно создать с помощью генератора. Он принимает имя модели, атрибуты и их тип</p>
18
<p>Также, как и контроллеры, модели можно создать с помощью генератора. Он принимает имя модели, атрибуты и их тип</p>
19
<p>Команда создаст модель и миграции, если их нет:</p>
19
<p>Команда создаст модель и миграции, если их нет:</p>
20
<p>Если же они есть, и модель совпадает со схемой таблицы, то команда миграции не затронет</p>
20
<p>Если же они есть, и модель совпадает со схемой таблицы, то команда миграции не затронет</p>
21
<h2>Валидация модели</h2>
21
<h2>Валидация модели</h2>
22
<p>Валидация в Ruby on Rails - это процесс проверки данных перед их сохранением в базе данных. Она обеспечивает целостность и корректность данных, предотвращая сохранение некорректной или неполной информации. Валидации помогают гарантировать, что данные соответствуют определенным критериям, таким как обязательные поля, уникальность значений и формат данных. Это особенно важно для поддержания качества данных и предотвращения ошибок, которые могут возникнуть при работе с некорректной информацией.</p>
22
<p>Валидация в Ruby on Rails - это процесс проверки данных перед их сохранением в базе данных. Она обеспечивает целостность и корректность данных, предотвращая сохранение некорректной или неполной информации. Валидации помогают гарантировать, что данные соответствуют определенным критериям, таким как обязательные поля, уникальность значений и формат данных. Это особенно важно для поддержания качества данных и предотвращения ошибок, которые могут возникнуть при работе с некорректной информацией.</p>
23
<p>Rails предоставляет встроенные валидации, которые можно использовать в моделях. Пример модели с различными валидациями:</p>
23
<p>Rails предоставляет встроенные валидации, которые можно использовать в моделях. Пример модели с различными валидациями:</p>
24
<p>Мы можем добавить в нашу модель валидацию и проверить ее работу:</p>
24
<p>Мы можем добавить в нашу модель валидацию и проверить ее работу:</p>
25
<p>Метод validate() выполняет валидацию и если все проверки прошли, то он вернет true.</p>
25
<p>Метод validate() выполняет валидацию и если все проверки прошли, то он вернет true.</p>
26
<p>У метода validate() есть аналогичный bang-метод validate!(). В отличии от validate() он выбрасывает исключение ActiveRecord::RecordInvalid. Это позволяет вам обрабатывать ошибки валидации более явно.</p>
26
<p>У метода validate() есть аналогичный bang-метод validate!(). В отличии от validate() он выбрасывает исключение ActiveRecord::RecordInvalid. Это позволяет вам обрабатывать ошибки валидации более явно.</p>
27
<p>в ActiveRecord у моделей есть еще метод valid?(), который тоже выполняет валидацию. Но так как функция - предикат, следует использовать метод по назначению - для проверки валидности модели и явно проверять, валидна модель или нет</p>
27
<p>в ActiveRecord у моделей есть еще метод valid?(), который тоже выполняет валидацию. Но так как функция - предикат, следует использовать метод по назначению - для проверки валидности модели и явно проверять, валидна модель или нет</p>
28
<h3>Получение ошибок валидации</h3>
28
<h3>Получение ошибок валидации</h3>
29
<p>После выполнения валидации мы можем получить сообщения об ошибках. Для их получение необходимо использовать метод errors() у модели.</p>
29
<p>После выполнения валидации мы можем получить сообщения об ошибках. Для их получение необходимо использовать метод errors() у модели.</p>
30
<p>Если валидация прошла без ошибок, то и ошибок не будет:</p>
30
<p>Если валидация прошла без ошибок, то и ошибок не будет:</p>
31
<p>Методы messages() и full_messages() позволяют получить тексты ошибок:</p>
31
<p>Методы messages() и full_messages() позволяют получить тексты ошибок:</p>
32
<p>Перед вызовом метода validate или validate!, вы можете получить доступ к объекту errors, но он будет пустым, так как валидация еще не была выполнена:</p>
32
<p>Перед вызовом метода validate или validate!, вы можете получить доступ к объекту errors, но он будет пустым, так как валидация еще не была выполнена:</p>
33
<h2>Методы модели для работы с БД</h2>
33
<h2>Методы модели для работы с БД</h2>
34
<p>Методы моделей Active Record позволяют выполнять операции CRUD (Create, Read, Update, Delete) и управлять данными в БД</p>
34
<p>Методы моделей Active Record позволяют выполнять операции CRUD (Create, Read, Update, Delete) и управлять данными в БД</p>
35
<h3>Создание записей</h3>
35
<h3>Создание записей</h3>
36
<p>Модели Rails предоставляют методы создания объектов в БД:</p>
36
<p>Модели Rails предоставляют методы создания объектов в БД:</p>
37
<p>Метод save() сохраняет модель и возвращает булево значение:</p>
37
<p>Метод save() сохраняет модель и возвращает булево значение:</p>
38
<p>Метод create() позволяет создать и сохранить модель сразу:</p>
38
<p>Метод create() позволяет создать и сохранить модель сразу:</p>
39
<p>Валидация работает и на методах создания, перед сохранением в БД. Метод save() выполняет валидацию перед сохранением, и если объект не проходит валидацию, он не будет сохранен, а метод вернет false. Если валидация проходит успешно, объект будет сохранен, и метод вернет true.</p>
39
<p>Валидация работает и на методах создания, перед сохранением в БД. Метод save() выполняет валидацию перед сохранением, и если объект не проходит валидацию, он не будет сохранен, а метод вернет false. Если валидация проходит успешно, объект будет сохранен, и метод вернет true.</p>
40
<p>Метод create() при неуспешной валидации не сохранит модель</p>
40
<p>Метод create() при неуспешной валидации не сохранит модель</p>
41
<p>У методов создания есть аналогичные save!(), create!(), которые выбрасывают исключение</p>
41
<p>У методов создания есть аналогичные save!(), create!(), которые выбрасывают исключение</p>
42
<h3>Методы чтения</h3>
42
<h3>Методы чтения</h3>
43
<p>Различные методы чтения у моделей позволяют находить объекты, сортировать их</p>
43
<p>Различные методы чтения у моделей позволяют находить объекты, сортировать их</p>
44
<ul><li><p>all() возвращает все записи из таблицы</p>
44
<ul><li><p>all() возвращает все записи из таблицы</p>
45
</li>
45
</li>
46
<li><p>find() находит запись по ее ID. Если запись не найдена, выбрасывает исключение</p>
46
<li><p>find() находит запись по ее ID. Если запись не найдена, выбрасывает исключение</p>
47
</li>
47
</li>
48
</ul><ul><li>find_by() находит первую запись, соответствующую заданным условиям. Возвращает nil, если запись не найдена.</li>
48
</ul><ul><li>find_by() находит первую запись, соответствующую заданным условиям. Возвращает nil, если запись не найдена.</li>
49
</ul><h3>Методы обновления</h3>
49
</ul><h3>Методы обновления</h3>
50
<p>Методы обновления позволяют изменять существующие записи в базе данных. Метод update() обновляет атрибуты объекта и сохраняет изменения в базе данных. Если валидация не проходит, изменения не сохраняются.</p>
50
<p>Методы обновления позволяют изменять существующие записи в базе данных. Метод update() обновляет атрибуты объекта и сохраняет изменения в базе данных. Если валидация не проходит, изменения не сохраняются.</p>
51
<ul><li>Метод update! работает аналогично update, но выбрасывает исключение ActiveRecord::RecordInvalid, если валидация не проходит.</li>
51
<ul><li>Метод update! работает аналогично update, но выбрасывает исключение ActiveRecord::RecordInvalid, если валидация не проходит.</li>
52
</ul><ul><li>Метод update_all() обновляет все записи, соответствующие заданному условию, и не вызывает валидацию. Он используется для массового обновления.</li>
52
</ul><ul><li>Метод update_all() обновляет все записи, соответствующие заданному условию, и не вызывает валидацию. Он используется для массового обновления.</li>
53
</ul><h3>Методы удаления</h3>
53
</ul><h3>Методы удаления</h3>
54
<p>Для удаления используют метод Model.destroy(), он удаляет экземпляр объекта из БД. Метод Model.destroy_all() удаляет все записи</p>
54
<p>Для удаления используют метод Model.destroy(), он удаляет экземпляр объекта из БД. Метод Model.destroy_all() удаляет все записи</p>
55
<h3>Query Builder</h3>
55
<h3>Query Builder</h3>
56
<p>Query Builder - это часть Active Record, которая позволяет строить SQL-запросы с помощью методов. Методы можно комбинировать с помощью fluent interface, создавая выборки.</p>
56
<p>Query Builder - это часть Active Record, которая позволяет строить SQL-запросы с помощью методов. Методы можно комбинировать с помощью fluent interface, создавая выборки.</p>
57
<p>Выбор всех пользователей по имени John</p>
57
<p>Выбор всех пользователей по имени John</p>
58
<p>Поиск без условия с лимитом</p>
58
<p>Поиск без условия с лимитом</p>
59
<p>Можно использовать и агрегатные функции SQL</p>
59
<p>Можно использовать и агрегатные функции SQL</p>
60
<p>Более сложный запрос</p>
60
<p>Более сложный запрос</p>
61
<h2>Сиды</h2>
61
<h2>Сиды</h2>
62
<p>Сиды (или seed data) в Ruby on Rails представляют собой начальные данные, которые загружаются в базу данных при первом запуске приложения или при необходимости заполнить базу данными для тестирования.</p>
62
<p>Сиды (или seed data) в Ruby on Rails представляют собой начальные данные, которые загружаются в базу данных при первом запуске приложения или при необходимости заполнить базу данными для тестирования.</p>
63
<h3>Как использовать сиды в Rails</h3>
63
<h3>Как использовать сиды в Rails</h3>
64
<p>В Rails файл сидов находится по умолчанию в файле<em>db/seeds.rb</em>. Этот файл используется для определения начальных данных, которые будут загружены в базу данных.</p>
64
<p>В Rails файл сидов находится по умолчанию в файле<em>db/seeds.rb</em>. Этот файл используется для определения начальных данных, которые будут загружены в базу данных.</p>
65
<p>Внутри файла<em>db/seeds.rb</em>мы можем использовать методы ActiveRecord для создания записей. Чтобы не создавать тестовые данные вручную, можно использовать специальный гем<a>faker</a>:</p>
65
<p>Внутри файла<em>db/seeds.rb</em>мы можем использовать методы ActiveRecord для создания записей. Чтобы не создавать тестовые данные вручную, можно использовать специальный гем<a>faker</a>:</p>
66
<p>После того как мы определили начальные данные в файле<em>db/seeds.rb</em>, их можно загрузить их в базу данных с помощью команды:</p>
66
<p>После того как мы определили начальные данные в файле<em>db/seeds.rb</em>, их можно загрузить их в базу данных с помощью команды:</p>
67
<p>Если нужно обновить сиды, то можно просто изменить файл<em>seeds.rb</em>и снова запустить команду rails db:seed. Однако, если мы хотим избежать дублирования данных, то нужно очистить таблицы, используя метод destroy_all:</p>
67
<p>Если нужно обновить сиды, то можно просто изменить файл<em>seeds.rb</em>и снова запустить команду rails db:seed. Однако, если мы хотим избежать дублирования данных, то нужно очистить таблицы, используя метод destroy_all:</p>
68
<h2>Скоупы</h2>
68
<h2>Скоупы</h2>
69
<p>Скоупы (scopes) в Ruby on Rails - это удобный способ определения часто используемых запросов к базе данных в моделях. Они позволяют создавать методы, которые возвращают наборы записей, соответствующие определенным условиям, и делают код более читаемым и поддерживаемым.</p>
69
<p>Скоупы (scopes) в Ruby on Rails - это удобный способ определения часто используемых запросов к базе данных в моделях. Они позволяют создавать методы, которые возвращают наборы записей, соответствующие определенным условиям, и делают код более читаемым и поддерживаемым.</p>
70
<p>Синтаксис:</p>
70
<p>Синтаксис:</p>
71
<p>Определим скоуп активных пользователей:</p>
71
<p>Определим скоуп активных пользователей:</p>
72
<p>Применение:</p>
72
<p>Применение:</p>
73
<p>Скоупы можно комбинировать для создания более сложных запросов</p>
73
<p>Скоупы можно комбинировать для создания более сложных запросов</p>
74
<h2>Rails Console</h2>
74
<h2>Rails Console</h2>
75
<p>Rails Console - это REPL позволяющий работать с приложением Ruby on Rails.</p>
75
<p>Rails Console - это REPL позволяющий работать с приложением Ruby on Rails.</p>
76
<p>Ее можно вызвать командой bin/rails c:</p>
76
<p>Ее можно вызвать командой bin/rails c:</p>
77
<p>Внутри консоли можно обратиться к методам моделей, создать их, прочитать и так далее. При выполнении запросов к БД выводятся SQL запросы</p>
77
<p>Внутри консоли можно обратиться к методам моделей, создать их, прочитать и так далее. При выполнении запросов к БД выводятся SQL запросы</p>
78
<p>Консоль можно использовать для отладки:</p>
78
<p>Консоль можно использовать для отладки:</p>
79
<p>Или загрузить данные из сидов:</p>
79
<p>Или загрузить данные из сидов:</p>
80
<p>Если мы что-то изменим в коде, то изменения не подтянутся автоматом. Для этого нужно использовать метод reload!</p>
80
<p>Если мы что-то изменим в коде, то изменения не подтянутся автоматом. Для этого нужно использовать метод reload!</p>
81
<p>Для выхода из консоли необходимо ввести exit.</p>
81
<p>Для выхода из консоли необходимо ввести exit.</p>
82
<h2>Выводы</h2>
82
<h2>Выводы</h2>
83
<p>Модели в Ruby on Rails играют ключевую роль в управлении данными и бизнес-логикой, соответствуя таблицам в базе данных и определяя структуру данных.</p>
83
<p>Модели в Ruby on Rails играют ключевую роль в управлении данными и бизнес-логикой, соответствуя таблицам в базе данных и определяя структуру данных.</p>
84
<p>Миграции предоставляют разработчикам возможность изменять структуру базы данных с помощью кода, что упрощает процесс управления схемой и обеспечивает версионирование изменений.</p>
84
<p>Миграции предоставляют разработчикам возможность изменять структуру базы данных с помощью кода, что упрощает процесс управления схемой и обеспечивает версионирование изменений.</p>
85
<p>Валидация данных перед их сохранением гарантирует целостность и корректность информации, предотвращая ошибки. Методы работы с данными, такие как создание, чтение, обновление и удаление записей, делают взаимодействие с базой данных более удобным.</p>
85
<p>Валидация данных перед их сохранением гарантирует целостность и корректность информации, предотвращая ошибки. Методы работы с данными, такие как создание, чтение, обновление и удаление записей, делают взаимодействие с базой данных более удобным.</p>
86
<p>Сиды позволяют загружать начальные данные в базу для тестирования и разработки, а скоупы упрощают создание часто используемых запросов, делая код более читаемым и поддерживаемым</p>
86
<p>Сиды позволяют загружать начальные данные в базу для тестирования и разработки, а скоупы упрощают создание часто используемых запросов, делая код более читаемым и поддерживаемым</p>