SlideShare a Scribd company logo
1 of 27
Download to read offline
#5 Ruby on Rails. Работа
с моделями
Продолжение занятия №4
Денис Калесников, главный программист Мэйк
make.st
На прошлом занятии
1. Миграции
2. Генератор миграций и моделей
3. Реализация связи один-ко-многим
Подготовка к занятию
1. Кто скачал демо-приложение
a. В консоли выполнить git pull
2. У кого нет демо-приложения
a. cd ~
b. Выполняем инструкции по адресу https://github.com/DenisKem/ruby_lesson1
Связь многие-ко-многим
Связь многие-ко-многим. Алгоритм
Создать соединительную модель. Она часто имеет название Model1ToModel2
Связать ее с двумя моделями, с помощью связи многие-к-одному.
Связать первую и вторую модели через соединительную таблицу, при
помощи has_many: through
Задание 4
Допустим что предприятие для которого мы разрабатываем реестр
сотрудников занимается разработкой проектов в какой-нибудь области. В
таком случае в одном проекте могут участвовать несколько сотрудников, а
сотрудник может быть привлечен одновременно к нескольким проектам.
Получается что сотрудники и проекты связаны связью многие-ко-многим.
Задание 4
Связать сотрудников с их проектами. Для это требуется:
1. Создать модель Project (проект)
2. Создать модель EmployeeToProject
3. Настроить связи
4. Запустить тестовый скрипт
a. В консоли rake demo: employees_projects
b. lib/tasks/demo.rake
На след. слайде краткая памятка :)
Напоминаем
Создание модели
bundle exec rails g model ModelName field1:datatype field2:datatype
Связь многие-к-одному
belongs_to :authors
has_many :books
Создание сущностей
1. Без сохранения в БД
a. Model.new params. # Данный объект можно сохранить потом, вызвав метод save/save!
2. С сохранением
a. Model.create(params) # вернет boolean-значение сохранилась ли запись
b. Model.create!(params) # выкинет исключение, если провалена валидация
Создание сущностей через связи
object.another_models.create(params)
object.another_models.build(params) # Без сохранения в БД.
Без этих удобных методов нам пришлось бы создать объект AnotherModel и
вручную задать значение AnotherModel#project_id.
В случае связи многие-ко-многим пришлось бы совершить гораздо больше
действий.
Взаимодействие с объектом
employee = Employee.new
employee.position = Position.all.sample # или
employee.assign_attributes position: Position.all.sample
employee.save
Тестовые данные. db/seeds.rb
В начале файла происходит очистка БД путем вызова для каждой модели
метода delete_all
Далее создаем тестовые данные. Первыми заполняются данные, от которых
зависят другие данные (например, сперва категории блога, а затем посты)
Полезным будет использовать гем faker
Задание 5
Доработать “сиды” проекта:
1. В начало файла добавить удаление проектов
2. Добавить тестовые проекты
3. Привязать случайным образом сотрудников к тестовым проектам
Запросы к БД
Для получения объектов из базы данных нет необходимости писать вручную
SQL-запросы. ORM Active Record выполнит запросы в базу данных за вас, он
совместим с большинством СУБД (MySQL, PostgreSQL и SQLite - это только
некоторые из них). Независимо от того, какая используется СУБД, формат
методов Active Record будет всегда одинаковый.
Запросы. Получение одного объекта
Model#find(id) поиск по первичному ключу
Model#find_by_field(field) поиск по конкретному полю
Методы с восклицательным знаком, а также метод Model#find будут
выбрасывать исключение ActiveRecord::RecordNotFound, если в базе
отсутствует такая запись.
Запросы. Получение коллекции
Model#all - получить все записи данной модели
Model#where(condition) - добавляет условие выборк. Является цепочечным
методом, то есть можно собирать следующего вида конструкции:
Model.where(...).where(...)
Model#where.not(condition) используется для отрицания (предикат NOT)
Примеры можной найти в сгенерированном скаффолде.
Запросы. Как не надо делать
Client.where("first_name LIKE '%#{params[:first_name]}%'") - место для атаки SQL-
инъекцией.
Запросы. Безопасные условия
Client.where("first_name LIKE :first_name”, first_name: “%#{params[:first_name]}%")
Client.where("first_name LIKE ?”, “%#{params[:first_name]}%")
Для условия можно использовать и массивы.
Client.where(first_name: [‘Саша’, ‘Маша’, ‘Петя’])
http://rusrails.ru/ruby-on-rails-security-guide#sql-in-ektsii
Сортировка
Чтобы получить записи из базы данных в определенном порядке, можете
использовать метод order.
Client.order(:created_at)
# ИЛИ
Client.order("created_at")
Client.order(created_at: :desc)
# ИЛИ
Client.order(created_at: :asc)
Задание 6
Отсортировать сотрудников по продолжительности работы на предприятии.
Взаимодействие с существующими объектами
employee = Employee.find_by_name ‘Иван’
employee.position = Position.all.sample
employee.save # или
employee.update position: Position.all.sample
Валидации моделей
Объект считается валидным, когда все его поля соответсвуют каким-либо
определенным условиям. Например, сущность Employee валидна - когда
заполнены имя работника и его должность. Хранение сотрудника в базе
сотрудника без имени бессмысленно и вредит системе
Подключение валидаций
В контексте класса модели пишется следующая конструкция
validates<пробел>:field1, [:field2, …], helper1, [helper2]
Helper - presence: true - обычная пара ключ-значение
Встроенные хэлперы валидации
Перечислены здесь:
http://rusrails.ru/active-record-validations
Можно определить кастомные валидаторы
Обработка ошибок валидации
Валидация вызывается
1. перед сохранением записи (create, create!, save, save!, update)
2. Прямым вызовом #valid?
Методы с восклицательным знаком при провале валидации выкидывают
исключения с текстом содержащим ошибки.
Методы без восклицательного знака при провале валидации возвращают
false. После этого у объекта можно вызвать метод errors, содержащий ошибки
в формате field_name => [‘error1’, ‘error2’]
Задание 7
В справочнике должностей все записи должны быть с уникальным названием.
Не должно быть должностей без названия.
У записи о работнике обязательно должны быть указаны его имя и
должность.
Спасибо за внимание!
Денис Калесников, главный программист Мэйк
make.st

More Related Content

What's hot

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Constantin Kichinsky
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptTimur Shemsedinov
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОFedor Malyshkin
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.Igor Shkulipa
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикIT61
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6Nikolay Samokhvalov
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЯковенко Кирилл
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Увеличиваем мощь фреймворка Kdt & code`s generator
Увеличиваем мощь фреймворка   Kdt & code`s generatorУвеличиваем мощь фреймворка   Kdt & code`s generator
Увеличиваем мощь фреймворка Kdt & code`s generatorSQALab
 
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван ЗахарченкоSolit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченкоsolit
 

What's hot (20)

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Groovy
GroovyGroovy
Groovy
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-framework
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Увеличиваем мощь фреймворка Kdt & code`s generator
Увеличиваем мощь фреймворка   Kdt & code`s generatorУвеличиваем мощь фреймворка   Kdt & code`s generator
Увеличиваем мощь фреймворка Kdt & code`s generator
 
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван ЗахарченкоSolit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
 

Similar to Ruby on Rails. Работа с моделями — продолжение

Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.Глеб Тарасов
 
Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014Andrey Listochkin
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CYandex
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Dev_Party
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf Conference
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORMMikhail Shamin
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in RussianOleg Kachan
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентовNikolay Samokhvalov
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайOntico
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014Andrey Listochkin
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 

Similar to Ruby on Rails. Работа с моделями — продолжение (20)

Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
 
Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORM
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in Russian
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
 
Grails & Groovy
Grails & GroovyGrails & Groovy
Grails & Groovy
 
Javascript
JavascriptJavascript
Javascript
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014
 
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
 
бегун
бегунбегун
бегун
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 

More from Digital-агентство Мэйк

Системные коммуникации с пациентом
Системные коммуникации с пациентомСистемные коммуникации с пациентом
Системные коммуникации с пациентомDigital-агентство Мэйк
 
Как эффективно развивать и удерживать нужных сотрудников
Как эффективно развивать и удерживать нужных сотрудниковКак эффективно развивать и удерживать нужных сотрудников
Как эффективно развивать и удерживать нужных сотрудниковDigital-агентство Мэйк
 
Индивидуальный тюнинг и кастомизации своего продукта как новая стратегия раб...
Индивидуальный тюнинг и кастомизации своего продукта как новая стратегия раб...Индивидуальный тюнинг и кастомизации своего продукта как новая стратегия раб...
Индивидуальный тюнинг и кастомизации своего продукта как новая стратегия раб...Digital-агентство Мэйк
 
12 эффективных инструментов для отрыва от конкурентов
12 эффективных инструментов для отрыва от конкурентов 12 эффективных инструментов для отрыва от конкурентов
12 эффективных инструментов для отрыва от конкурентов Digital-агентство Мэйк
 
Современные тенденции против устаревших стереотипов
Современные тенденции против устаревших стереотиповСовременные тенденции против устаревших стереотипов
Современные тенденции против устаревших стереотиповDigital-агентство Мэйк
 
Продвижение в соцсетях: 13 эффективных способов
Продвижение в соцсетях: 13 эффективных способовПродвижение в соцсетях: 13 эффективных способов
Продвижение в соцсетях: 13 эффективных способовDigital-агентство Мэйк
 
Crm системы: клиент в центре внимания
Crm системы: клиент в центре вниманияCrm системы: клиент в центре внимания
Crm системы: клиент в центре вниманияDigital-агентство Мэйк
 
Системный подход к привлечению клиентов
Системный подход к привлечению клиентовСистемный подход к привлечению клиентов
Системный подход к привлечению клиентовDigital-агентство Мэйк
 
Cоциальные сети для молодёжных объединений
Cоциальные сети для молодёжных объединенийCоциальные сети для молодёжных объединений
Cоциальные сети для молодёжных объединенийDigital-агентство Мэйк
 
Эффективный сайт медицинского учреждения
Эффективный сайт медицинского учрежденияЭффективный сайт медицинского учреждения
Эффективный сайт медицинского учрежденияDigital-агентство Мэйк
 
Контекстная реклама: от теории к практике
Контекстная реклама: от теории к практикеКонтекстная реклама: от теории к практике
Контекстная реклама: от теории к практикеDigital-агентство Мэйк
 

More from Digital-агентство Мэйк (14)

Системные коммуникации с пациентом
Системные коммуникации с пациентомСистемные коммуникации с пациентом
Системные коммуникации с пациентом
 
Как эффективно развивать и удерживать нужных сотрудников
Как эффективно развивать и удерживать нужных сотрудниковКак эффективно развивать и удерживать нужных сотрудников
Как эффективно развивать и удерживать нужных сотрудников
 
Индивидуальный тюнинг и кастомизации своего продукта как новая стратегия раб...
Индивидуальный тюнинг и кастомизации своего продукта как новая стратегия раб...Индивидуальный тюнинг и кастомизации своего продукта как новая стратегия раб...
Индивидуальный тюнинг и кастомизации своего продукта как новая стратегия раб...
 
12 эффективных инструментов для отрыва от конкурентов
12 эффективных инструментов для отрыва от конкурентов 12 эффективных инструментов для отрыва от конкурентов
12 эффективных инструментов для отрыва от конкурентов
 
4 шага к счастью клиента
4 шага к счастью клиента4 шага к счастью клиента
4 шага к счастью клиента
 
Современные тенденции против устаревших стереотипов
Современные тенденции против устаревших стереотиповСовременные тенденции против устаревших стереотипов
Современные тенденции против устаревших стереотипов
 
Продвижение в соцсетях: 13 эффективных способов
Продвижение в соцсетях: 13 эффективных способовПродвижение в соцсетях: 13 эффективных способов
Продвижение в соцсетях: 13 эффективных способов
 
Угрозы безопасности в интернете
Угрозы безопасности в интернетеУгрозы безопасности в интернете
Угрозы безопасности в интернете
 
Crm системы: клиент в центре внимания
Crm системы: клиент в центре вниманияCrm системы: клиент в центре внимания
Crm системы: клиент в центре внимания
 
Ruby on Rails. Ajax-обработка html-форм
Ruby on Rails. Ajax-обработка html-формRuby on Rails. Ajax-обработка html-форм
Ruby on Rails. Ajax-обработка html-форм
 
Системный подход к привлечению клиентов
Системный подход к привлечению клиентовСистемный подход к привлечению клиентов
Системный подход к привлечению клиентов
 
Cоциальные сети для молодёжных объединений
Cоциальные сети для молодёжных объединенийCоциальные сети для молодёжных объединений
Cоциальные сети для молодёжных объединений
 
Эффективный сайт медицинского учреждения
Эффективный сайт медицинского учрежденияЭффективный сайт медицинского учреждения
Эффективный сайт медицинского учреждения
 
Контекстная реклама: от теории к практике
Контекстная реклама: от теории к практикеКонтекстная реклама: от теории к практике
Контекстная реклама: от теории к практике
 

Ruby on Rails. Работа с моделями — продолжение

  • 1. #5 Ruby on Rails. Работа с моделями Продолжение занятия №4 Денис Калесников, главный программист Мэйк make.st
  • 2. На прошлом занятии 1. Миграции 2. Генератор миграций и моделей 3. Реализация связи один-ко-многим
  • 3. Подготовка к занятию 1. Кто скачал демо-приложение a. В консоли выполнить git pull 2. У кого нет демо-приложения a. cd ~ b. Выполняем инструкции по адресу https://github.com/DenisKem/ruby_lesson1
  • 5. Связь многие-ко-многим. Алгоритм Создать соединительную модель. Она часто имеет название Model1ToModel2 Связать ее с двумя моделями, с помощью связи многие-к-одному. Связать первую и вторую модели через соединительную таблицу, при помощи has_many: through
  • 6. Задание 4 Допустим что предприятие для которого мы разрабатываем реестр сотрудников занимается разработкой проектов в какой-нибудь области. В таком случае в одном проекте могут участвовать несколько сотрудников, а сотрудник может быть привлечен одновременно к нескольким проектам. Получается что сотрудники и проекты связаны связью многие-ко-многим.
  • 7. Задание 4 Связать сотрудников с их проектами. Для это требуется: 1. Создать модель Project (проект) 2. Создать модель EmployeeToProject 3. Настроить связи 4. Запустить тестовый скрипт a. В консоли rake demo: employees_projects b. lib/tasks/demo.rake На след. слайде краткая памятка :)
  • 8. Напоминаем Создание модели bundle exec rails g model ModelName field1:datatype field2:datatype Связь многие-к-одному belongs_to :authors has_many :books
  • 9. Создание сущностей 1. Без сохранения в БД a. Model.new params. # Данный объект можно сохранить потом, вызвав метод save/save! 2. С сохранением a. Model.create(params) # вернет boolean-значение сохранилась ли запись b. Model.create!(params) # выкинет исключение, если провалена валидация
  • 10. Создание сущностей через связи object.another_models.create(params) object.another_models.build(params) # Без сохранения в БД. Без этих удобных методов нам пришлось бы создать объект AnotherModel и вручную задать значение AnotherModel#project_id. В случае связи многие-ко-многим пришлось бы совершить гораздо больше действий.
  • 11. Взаимодействие с объектом employee = Employee.new employee.position = Position.all.sample # или employee.assign_attributes position: Position.all.sample employee.save
  • 12. Тестовые данные. db/seeds.rb В начале файла происходит очистка БД путем вызова для каждой модели метода delete_all Далее создаем тестовые данные. Первыми заполняются данные, от которых зависят другие данные (например, сперва категории блога, а затем посты) Полезным будет использовать гем faker
  • 13. Задание 5 Доработать “сиды” проекта: 1. В начало файла добавить удаление проектов 2. Добавить тестовые проекты 3. Привязать случайным образом сотрудников к тестовым проектам
  • 14. Запросы к БД Для получения объектов из базы данных нет необходимости писать вручную SQL-запросы. ORM Active Record выполнит запросы в базу данных за вас, он совместим с большинством СУБД (MySQL, PostgreSQL и SQLite - это только некоторые из них). Независимо от того, какая используется СУБД, формат методов Active Record будет всегда одинаковый.
  • 15. Запросы. Получение одного объекта Model#find(id) поиск по первичному ключу Model#find_by_field(field) поиск по конкретному полю Методы с восклицательным знаком, а также метод Model#find будут выбрасывать исключение ActiveRecord::RecordNotFound, если в базе отсутствует такая запись.
  • 16. Запросы. Получение коллекции Model#all - получить все записи данной модели Model#where(condition) - добавляет условие выборк. Является цепочечным методом, то есть можно собирать следующего вида конструкции: Model.where(...).where(...) Model#where.not(condition) используется для отрицания (предикат NOT) Примеры можной найти в сгенерированном скаффолде.
  • 17. Запросы. Как не надо делать Client.where("first_name LIKE '%#{params[:first_name]}%'") - место для атаки SQL- инъекцией.
  • 18. Запросы. Безопасные условия Client.where("first_name LIKE :first_name”, first_name: “%#{params[:first_name]}%") Client.where("first_name LIKE ?”, “%#{params[:first_name]}%") Для условия можно использовать и массивы. Client.where(first_name: [‘Саша’, ‘Маша’, ‘Петя’]) http://rusrails.ru/ruby-on-rails-security-guide#sql-in-ektsii
  • 19. Сортировка Чтобы получить записи из базы данных в определенном порядке, можете использовать метод order. Client.order(:created_at) # ИЛИ Client.order("created_at") Client.order(created_at: :desc) # ИЛИ Client.order(created_at: :asc)
  • 20. Задание 6 Отсортировать сотрудников по продолжительности работы на предприятии.
  • 21. Взаимодействие с существующими объектами employee = Employee.find_by_name ‘Иван’ employee.position = Position.all.sample employee.save # или employee.update position: Position.all.sample
  • 22. Валидации моделей Объект считается валидным, когда все его поля соответсвуют каким-либо определенным условиям. Например, сущность Employee валидна - когда заполнены имя работника и его должность. Хранение сотрудника в базе сотрудника без имени бессмысленно и вредит системе
  • 23. Подключение валидаций В контексте класса модели пишется следующая конструкция validates<пробел>:field1, [:field2, …], helper1, [helper2] Helper - presence: true - обычная пара ключ-значение
  • 24. Встроенные хэлперы валидации Перечислены здесь: http://rusrails.ru/active-record-validations Можно определить кастомные валидаторы
  • 25. Обработка ошибок валидации Валидация вызывается 1. перед сохранением записи (create, create!, save, save!, update) 2. Прямым вызовом #valid? Методы с восклицательным знаком при провале валидации выкидывают исключения с текстом содержащим ошибки. Методы без восклицательного знака при провале валидации возвращают false. После этого у объекта можно вызвать метод errors, содержащий ошибки в формате field_name => [‘error1’, ‘error2’]
  • 26. Задание 7 В справочнике должностей все записи должны быть с уникальным названием. Не должно быть должностей без названия. У записи о работнике обязательно должны быть указаны его имя и должность.
  • 27. Спасибо за внимание! Денис Калесников, главный программист Мэйк make.st