-
Что такое ActiveRecord, и какие средства предоставляет для работы с объектами?
Ответ
ActiveRecord это паттерн программирования. AR является популярным способом доступа к данным реляционных баз данных в объектно-ориентированном программировании. ActiveRecord еще называют буквой M в MVC — которая является слоем в системе, ответственным за представление бизнес-логики и данных.Active Record упрощает создание и использование бизнес-объектов, данные которых требуют персистентного хранения в базе данных. Сама по себе эта реализация паттерна Active Record является описанием системы ORM (Object Relational Mapping). Active Record это фреймворк ORM.
Active Record предоставляет нам несколько механизмов, наиболее важными из которых являются способности для:
- Представления моделей и их данных.
- Представления связей между этими моделями.
- Представления иерархий наследования с помощью связанных моделей.
- Валидации моделей до того, как они станут персистентными в базе данных.
- Выполнения операций с базой данных в объектно-ориентированном стиле.
Подробнее:
-
За что отвечают Model, View, Controller уровни в Rails?
Ответ
MVC — это паттерн программирования, который подразумевает схему разделения данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента. -
Как работает роутинг? Что такое ресурсные роуты? Как они формируются?
Ответ
Браузеры запрашивают страницы от Rails, выполняя запрос по URL, используя определенный метод HTTP, такой как GET, POST, PATCH, PUT и DELETE.Роутинг распознает запрос по методу и по URL и направляет его в экшн контроллера или в приложение Rack.
Он также может генерировать пути и URL, избегая необходимость жестко прописывать строки в ваших вьюхах.
Ресурсный роутинг позволяет быстро объявлять все общие маршруты для заданного ресурсного контроллера. Вместо объявления отдельных маршрутов для экшнов
index
,show
,new
,edit
,create
,update
иdestroy
, ресурсный маршрут объявляет их одной строчкой кода. -
Как использовать
content_for
иyield
? -
Что такое скоупы (scopes)? Как использовать?
Ответ
Скоупы позволяют задавать часто используемые запросы, к которым можно обращаться как к вызовам метода в связанных объектах или моделях. С помощью этих скоупов можно использовать такие методы как where, joins и includes. Все методы скоупов возвращают объект
ActiveRecord::Relation
, который позволяет вызывать на нем дополнительные методы (такие как другие скоупы).Для определения простого скоупа мы используем метод scope внутри класса, передав запрос, который хотим запустить при вызове этого скоупа:
class Article < ApplicationRecord scope :published, -> { where(published: true) } end
Подробнее тут
-
Что такое ActiveJob? Когда его использовать?
Ответ
Active Job - это фреймворк для объявления заданий и их запуска на разных бэкендах очередей. Эти задания могут быть чем угодно: от регулярно запланированных чисток до списаний с карт или рассылок. В общем, всем, что может быть выделено в небольшие работающие части и запускаться параллельно.Имеет встроенные адаптеры для планировщиков фоновых задач:
- Sidekiq
- Resque
- Delayed Job
- и т.д.
-
Что такое Asset Pipeline?
Ответ
Asset Pipeline (файлопровод) - фреймворк для соединения и минимизации, или сжатия ассетов JavaScript и CSS. Он также добавляет возможность писать эти ассеты на других языках и препроцессорах, таких как CoffeeScript, Sass и ERB. Это позволяет автоматически комбинировать ассеты приложения с ассетами других гемов.Первой особенностью файлопровода является соединение ассетов, что может уменьшить количество запросов, необходимых браузеру для отображения страницы. Браузеры ограничены в количестве запросов, которые они могут выполнить параллельно, поэтому меньшее количество запросов может означать более быструю загрузку вашего приложения.
Второй особенностью файлопровода является минимизация или сжатие ассетов. Для файлов CSS это выполняется путем удаления пробелов и комментариев. Для JavaScript могут быть применены более сложные процессы. Можно выбирать из набора встроенных опций или определить свои.
Третьей особенностью файлопровода является то, что он позволяет писать эти ассеты на языке более высокого уровня с дальнейшей прекомпиляцией до фактического ассета. Поддерживаемые языки по умолчанию включают Sass для CSS, CoffeeScript для JavaScript и ERB для обоих.
-
Что такое serializer и для чего он нужен? Где применяется? В чем его основная задача?
Ответ
Сериализация (serialization) - процесс перевода каких-либо структур данных в последовательность битов. Обратный процесс называется "десериализация" (deserialization).Сериализация используется для передачи объектов по сети и сохранения их в файлы. Например: сериализация заполненного объекта в XML-документ с последующей передачей документа по HTTP или протоколам электронной почты.
Также часто используется для преобразования информации в формат JSON.
В Rails интерфейс базовой сериализации представлен модулем
ActiveModel::Serialization
Вам необходимо объявить хэш, содержащий атрибуты, которые вы хотите сериализовать. Атрибуты должны быть строками, не символами.Что касается JSON, то Active Model также предоставляет модуль
ActiveModel::Serializers::JSON
для сериализации/десериализации JSON. -
Что такое presenter и для чего он нужен? Где применяется? В чем его основная задача?
Ответ
Presenter - паттерн проектирования, простой класс (в Rails), использующийся для вынесения какой-либо логики по обработке моделей из слоя контроллеров и слоя представлений.Например:
module Posts class IndexPresenter # здесь как раз и разбивается логика шаблона и контроллера, # перенесите сюда логику из контроллеров def posts Posts.all end def authors Authors.all end def post_published_count Post.published_count end end end
Так будет выглядеть экшн
index
в контроллереdef index @presenter = Posts::IndexPresenter.new end
Так это будет представлено во
view
<p> Всего опубликовано: <%= @presenter.published_count %> </p> <%= @presenter.authors # проход по массиву и отображение%>
Подробнее тут
Еще можно здесь
-
Что такое валидации? Как написать свои валидации? Для чего нужны валидации? Где применяются валидации? Примеры Валидаций.
Ответ
Валидации используются, чтобы быть уверенными, что только проверенные данные сохраняются в вашу базу данных. Например, для вашего приложения может быть важно, что каждый пользователь предоставил валидный электронный и почтовый адреса.Валидации на уровне модели - наилучший способ убедиться, что в базу данных будут сохранены только валидные данные. Они не зависят от базы данных, не могут быть обойдены конечными пользователями и удобны в тестировании и обслуживании. Rails представляет простоту в обслуживании, представляет встроенные хелперы для общих нужд, а также позволяет создавать свои собственные методы валидации.
Пример простейшей валидации передачу в модель
Person
данных из поляname
:class Person < ApplicationRecord validates :name, presence: true end Person.create(name: "John Doe").valid? # => true Person.create(name: nil).valid? # => false
Разработчик так же в праве написать свои собственные правила валидации, которые будут располагаться в каталоге
app/validators
.Пример кастомной валидации
email
по определенному пользователем шаблону:class EmailValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i record.errors[attribute] << (options[:message] || "is not an email") end end end class Person < ApplicationRecord validates :email, presence: true, email: true end
-
Есть ли у Rails механизм, который отслеживает изменения в базе данных?
-
Что такое
Rack
?Ответ
https://www.8host.com/blog/kratkij-obzor-veb-serverov-dlya-prilozhenij-ruby/Rack это промежуточное программное обеспечение, оно делит входящие HTTP-запросы на различные этапы, затем обрабатывает их по частям, после чего посылает ответ веб-приложения (контроллера).
Программа Rack состоит из двух отдельных компонентов: обработчика и адаптера, с помощью которых происходит обмен данными между веб-серверами и приложениями (фреймворками).
Какие серверы есть:
- WEBrick
- Thin
- Puma
- Unicorn
- Phusion Passenger
- Iodine
-
Что такое
partial
и для чего используются?Ответ
partial — это кусочек кода, который можно вынести в отдельный темплейт, для удобства использования и для использования в других представлениях. -
Что такое Haml, Slim? Какие плюсы на ваш взгляд, их использования?
Ответ
Haml и Slim — это шаблонизаторы, используются для удобства использования и минимизации написания кода в представлениях. Сокращает в несколько раз написание кода, нет проблем в закрывании тегов, не получится что тег не закрыт и код не работает. Меньше вероятность что можно ошибиться + лучше читаемость в коде. -
Что означает несколько расширений файла example.html.erb?
Ответ
example — название файла
html — расширение, которое позволяет использовать стандартный язык разметки HyperText Markup Language
erb — позволяет включить использование кода написанного на языке Ruby вместе с языком разметки
-
Что такое ERB? Можете расшифровать аббревиатуру?
Ответ
ERB — Embedded Ruby (встроенный Ruby) -
Знать и рассказать структуру папок Rails приложения.
Ответ
📂 app — основные файлы приложения └📁 assets — картинки, стили, js └📁 controllers — контроллеры └📁 helpers — хелперы └📁 jobs — задания └📁 mailers — рассыльщики └📁 models — модели └📁 views — представления └📁 layouts — макеты 📂 config — конфигурация маршрутов, базы данных и т.д └📁 environments — настройки сред приложения └📁 locales — интернационализация 📂 db — текущая схема базы данных, сиды └📁 migrates — файлы миграции 📂 lib — внешние модули 📂 log — журналы логов 📂 public — доступна извне как есть, статичные файлы и скомпилированные ассеты 📂 test — структурирована по тестам моделей / контроллеров / интеграционным └📂 fixtures — вспомогательные данные (фикстуры) 📂 tmp — временные файлы (такие как файлы кэша и pid) 📂 vendor — код сторонних разработчиков, например, внешние гемы. └📂 plugins — внешние плагины
http://rusrails.ru/getting-started-with-rails#sozdanie-prilozheniya-blog
-
Какие связи для связывания моделей в приложении Rails вы знаете?
Ответ
Rails поддерживает шесть типов связей:belongs_to
has_one
has_many
has_many :through
has_one :through
has_and_belongs_to_many
-
Привести примеры использования
has_many
,belongs_to
,has_and_belongs_to_many
,has_one
,has_many :through
?Ответ
Фильм имеет имеет множество сезонов, сезон принадлежит фильму и имеет множество серий. У каждого фильма может быть только один официальный сайт. В каждом фильме снимается множество актёров, при этом каждый актёр снимается в разных фильмах:class Film < ApplicationRecord has_many :seasons has_many :episodes, through: :seasons has_one :official_site has_and_belongs_to_many :actors end class Season < ApplicationRecord belongs_to :film has_many :episodes end class Episode < ApplicationRecord belongs_to :season end class OfficialSite < ApplicationRecord belongs_to :film end class Actor < ApplicationRecord has_and_belongs_to_many :films end
-
Что лучше выбрать
has_many :through
илиhas_and_belongs_to_many
?Ответ
Это зависит от контекста связи
many-to-many
.Если планируется использование дополнительной логики в этой связи, создание дополнительных полей в соединительной таблице, то лучше отдать предпочтение
has_many :through
. В этом случае применяются промежуточные модели-связки.В том случае, если достаточно простой соединительной таблицы, то можно обойтись
has_and_belongs_to_many
(т.н. HBTM).http://rusrails.ru/active-record-associations#dopolnitelnye-metody-stolbtsov
-
Что такое полиморфные связи?
Ответ
Особый вид связи, при которой модель может принадлежать сразу нескольким моделям.Например, картинку можно добавлять к статье, комментарию, пользователю.
class Picture < ApplicationRecord belongs_to :imageable, polymorphic: true end class Article < ApplicationRecord has_many :pictures, as: :imageable end class Comment < ApplicationRecord has_many :pictures, as: :imageable end class User < ApplicationRecord has_many :pictures, as: :imageable end
При этом картинка сохраняет в себе имя класса и
id
объекта, которому она принадлежит. В приведённом примере у картинки имеются атрибутыimageable_id
иimageable_type
, это возможно благодаря миграции:class CreatePictures < ActiveRecord::Migration[5.2] def change create_table :pictures do |t| t.references :imageable, polymorphic: true, index: true end end end
http://rusrails.ru/active-record-associations#polymorphic-associations
-
Что такое
pluralize
и как он может быть полезен на проекте? -
Что такое
i18n
(интернационализация)?Ответ
Адаптация приложения к особенностям региона, в котором он будет использоваться.Название
i18n
происходит от английского слова internationalization, между первой и последней буквами i и n 18 букв.Гем
i18n
, поставляемый с Ruby on Rails (начиная с Rails 2.2), представляет простой и расширяемый фреймворк для перевода приложения на язык, отличный от английского, а также изменения формата даты, времени, валюты и т.д.Rails автоматически добавляет все файлы
.rb
и.yml
из директорииconfig/locales
к пути загрузки переводов. -
Что такое
dependent
связь?Ответ
Опция
:dependent
указывает, что необходимо сделать с зависимой моделью (моделями) при удалении текущей модели. В зависимости от типа связи может принимать значения::delete
— связанные объекты будут удалены прямо из базы данных без вызова методаdestroy
, т.е. без соответствующих коллбэков:delete_all
— см.:delete
:destroy
— будет вызванdestroy
на связанных объектах:nullify
— внешний ключ будет установленNULL
:restrict_with_error
— при наличии связанного объекта вызовет ошибку:restrict_with_exception
— при наличии связанного объекта вызовется исключение
-
Что такое
t.references
?Ответ
Столбец таблицы в миграции, указывающий на принадлежность к другой таблице. Например, книга принадлежит автору:class CreateBooks < ActiveRecord::Migration[5.2] def change create_table :books do |t| t.references :author end end end
-
Что такое exception и от чего наследуется?
-
Как сгенерировать модель, контрoллер, представление (вьюху)
Ответ
В Rails для создания моделей, контроллеров и представлений используется консольная команда
rails generate
(илиrails g
) с необходимыми ключами. Находиться при этом нужно в папке проекта. Генераторы в Rails сильно упрощают создание проекта, т.к. нет необходимости создавать каждый файл вручную.Например создание контроллера для модели "Greetings" в котором будет экшн
hello
:$ bin/rails generate controller Greetings hello create app/controllers/greetings_controller.rb route get "greetings/hello" invoke erb create app/views/greetings create app/views/greetings/hello.html.erb invoke test_unit create test/controllers/greetings_controller_test.rb invoke helper create app/helpers/greetings_helper.rb invoke assets invoke coffee create app/assets/javascripts/greetings.coffee invoke scss create app/assets/stylesheets/greetings.scss
-
Что такое scaffolding? Зачем он используется и где применяется?
Ответ
Rails Scaffold - встроенный генератор, который запускает другие генераторы Rails, чтобы одной командой сгенерировать набор из модели, контроллера, вьюх, тестов, миграций и т.д. Предоставляется возможность создавать собственные предустановки генерации. -
Как реализовано кеширование в рельсах?
Ответ
Кэширование означает хранение контента, генерируемого в цикле запрос-отклик, и повторное использование его при ответе на подобные запросы. Кэширование значительно загрузку страниц, снижает количество запросов к серверу.
Виды кэширования:
- Кэширование страницы — начиная с Rails 4 добавляется гемом
actionpack-page_caching
- Кэширование экшна — начиная с Rails 4 добавляется гемом
actionpack-action_caching
- Кэширование фрагмента — позволяет фрагменту логики вьюхи быть обернутым в блок кэша и обслуженным из хранилища кэша для последующего запроса
- Кэширование матрешкой (Russian doll caching) — Можно вкладывать кэшированные фрагменты в другие кэшированные фрагменты. Eсли обновляется отдельный продукт, другие внутренние фрагменты могут быть повторно использованы при регенерации внешнего фрагмента.
Rails также предоставляет другие виды кэширования
Подробнее:
- Кэширование страницы — начиная с Rails 4 добавляется гемом
-
ActiveRecord Query Interface - интерфейс запросов активрекорд. Для чего используется? Перечислите методы.
-
Чем отличаются методы
find
иfind_by
? -
Представьте, что есть огромная табл.
users
. Как можно перебрать ее элементы максимально быстро?Ответ
Быстро можно перебрать с помощью find_each, стандартно по 1000 записей.batch_size
— сколько обрабатывать записей за разstart
— с какого id к примеру продолжить работуfinish
— может использоваться совместно сstart
, к примеру чтобы выслать письма только пользователям с первичным ключом от 2000 до 10000:
https://apidock.com/rails/ActiveRecord/Batches/ClassMethods/find_each
-
Что такое проблема N+1 запроса?
-
Как можно решить проблему N+1 в Rails?
Ответ
Указанный код выполнит 10 + 1 запрос в БД (первый запрос загрузит 10 клиентов, а затем для каждого клиента будет сделано по запросу).clients = Client.limit(10) clients.each do |client| puts client.address.postcode end
Проблему N+1 можно решить при помощи метода
includes
, при этом Active Record обеспечивает то, что все указанные связи загружаются с использованием минимально возможного количества запросов:clients = Client.includes(:address).limit(10) clients.each do |client| puts client.address.postcode end
В данном случае будет сделано всего два запроса:
SELECT * FROM clients LIMIT 10 SELECT addresses.* FROM addresses WHERE (addresses.client_id IN (1,2,3,4,5,6,7,8,9,10))
http://rusrails.ru/active-record-query-interface#neterpelivaya-zagruzka-svyazey
-
Как без рендеринга шаблона сказать мобильному приложению, что у него нет прав на просмотр определённого контента одной строкой в контроллере?
Ответ
head :forbidden
или
render status: 403
-
Что такое Service Objects, Form Objects, View Objects, Query Objects, для чего они нужны?
Ответ
Это обычные классы Ruby, которые применяются для рефакторинга Rails-приложения, инкапсулируя часть логики моделей / представлений / контроллеров.Service Objects, например, используются, когда одновременно задействованы несколько моделей, когда производятся сложные действия с моделями.
Form Objects используются, когда отправка одной формы изменяет несколько моделей.
View Objects используются, например, когда большой метод внутри модели используется только отображения данных.
Query Objects используются для сложных SQL запросов, утяжеляющих модели/контроллеры.
-
Назовите отличия Hash и HashWithIndifferentAccess
Ответ
Отличие состоит в том, что из хэша нельзя достать значение по строковому ключу. Только по символу.В HashWithIndifferentAccess можно получить ключ двумя способами.
-
Чем отличается after_save от after_commit? Почему это плохие паттерны?
-
Есть 2 версии приложения и в новой версии мы хотим поменять у уже существующей колонки значения на дефолтные, но чтоб в старом приложении все работало со старыми значениями (бд одна само собой). Как ты это будешь делать? Какую миграцию напишешь?
-
Пустое приложение, как ты сделаешь регистрацию пользователя и отправку ему имейла сразу после регистрации? Доп вопрос - как гарантировать, что мы юзеру отошлем только 1 имейл?
Где искать ответы: