Вступ
Sinatra та ActiveRecord — два популярні фреймворки у Ruby-екосистемі, які можна об'єднати для створення потужних веб-застосунків. У цьому блозі ми розглянемо, як використовувати Sinatra разом з ActiveRecord, поєднуючи можливості легкого веб-фреймворку та гнучкого інструмента ORM (Object-Relational Mapping). Ми розглянемо процес налаштування, визначення моделей, виконання операцій з базою даних, інтеграцію ActiveRecord з маршрутами Sinatra, а також додаткові можливості. Почнімо!
Налаштування Sinatra і ActiveRecord
Спочатку переконайтеся, що у вашому середовищі Ruby встановлені гем Sinatra і ActiveRecord. Sinatra — це легкий веб-фреймворк, а ActiveRecord — ORM, який спрощує взаємодію з базами даних. Додайте такі рядки до вашого Gemfile
і виконайте команду bundle install
:
gem 'sinatra'
gem 'activerecord'
gem 'sqlite3' # Використовуйте інший адаптер за необхідності
Далі створіть основний файл програми Sinatra (app.rb
) і підключіть необхідні залежності:
require 'sinatra/base'
require 'sinatra/activerecord'
# Налаштування підключення до бази даних
set :database, 'sqlite3:database.db'# Ваш код додатка Sinatra додається тут
Визначення моделей і міграції бази даних
У Sinatra з ActiveRecord моделі використовуються для визначення структури та поведінки таблиць бази даних. Створімо просту модель “User” як приклад:
class User < ActiveRecord::Base
# Тут можна визначати асоціації, валідації та іншу логіку моделі
end
Для створення відповідної таблиці бази даних використовуємо міграції ActiveRecord. Створіть новий файл міграції з описовою назвою (наприклад, 001_create_users.rb
) у каталозі db/migrate
:
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps null: false
end
end
end
Запустіть міграцію за допомогою команди rake db:migrate
. Це створить таблицю "users" із зазначеними стовпцями.
Використання ActiveRecord у маршрутах Sinatra
Тепер, коли ми налаштували моделі та базу даних, давайте подивимося, як використовувати ActiveRecord у маршрутах Sinatra. Ось приклад базового маршруту, який отримує всіх користувачів із бази даних:
get '/users' do
users = User.all
users.to_json
end
У цьому прикладі User.all
отримує всі записи користувачів із таблиці "users". Результуюча колекція передається запиту, який може відобразити її потрібним способом.
Створення зв'язку "один до багатьох"
Зв'язок "один до багатьох" — це поширений сценарій, коли один запис у таблиці пов'язаний із кількома записами в іншій таблиці. У контексті нашого додатка для управління оголошеннями про нерухомість, припустімо, що у нас є моделі “Property” і “ListingAgent”. Кожна властивість може мати кількох агентів.
Визначення моделей
Спочатку визначте моделі для Property та ListingAgent. У відповідних файлах моделей (property.rb
і listing_agent.rb
) можна налаштувати зв'язок "один до багатьох" за допомогою методів has_many
і belongs_to
:
# property.rb
class Property < ActiveRecord::Base
has_many :listing_agents
# Інша логіка моделі Property
end
# listing_agent.rb
class ListingAgent < ActiveRecord::Base
belongs_to :property
# Інша логіка моделі ListingAgent
end
Додавання зовнішнього ключа
Для встановлення зв'язку потрібно додати стовпець зовнішнього ключа до таблиці, яка представляє сторону "багато". У нашому випадку потрібно додати стовпець property_id
до таблиці listing_agents
. Для цього створіть файл міграції (наприклад, 002_add_property_id_to_listing_agents.rb
) у каталозі db/migrate
:
class AddPropertyIdToListingAgents < ActiveRecord::Migration[6.0]
def change
add_column :listing_agents, :property_id, :integer
end
end
Потім запустіть міграцію за допомогою команди rake db:migrate
.
Оновлення форм і маршрутів: Щоб зв'язати агента зі списку з певною властивістю, необхідно оновити форми та маршрути відповідно. Наприклад, при створенні нового агента зі списку можна включити поле вибору для вибору пов'язаної властивості. У маршруті, який обробляє подання форми, ви можете призначити вибрану властивість агенту:
post '/listing_agents' do
@listing_agent = ListingAgent.new(params[:listing_agent])
@listing_agent.property = Property.find(params[:property_id])
if @listing_agent.save
redirect '/listing_agents'
else
erb :new_listing_agent
end
end
- Доступ до пов'язаних записів: Після встановлення зв'язку "один до багатьох" можна отримати доступ до пов'язаних записів з обох сторін. Наприклад, щоб отримати всіх агентів, пов'язаних з конкретною властивістю, можна використовувати метод асоціації
listing_agents
:
get '/properties/:id/listing_agents' do
@property = Property.find(params[:id])
@listing_agents = @property.listing_agents
@listing_agents.to_json
end
У цьому прикладі ми знаходимо властивість на основі переданого параметра id
і отримуємо пов'язаних агентів за допомогою методу listing_agents
.
Додаткові можливості
Sinatra і ActiveRecord пропонують багато додаткових можливостей, які покращують процес розробки. Ось кілька з них:
-
Маршрутизація: Sinatra забезпечує зрозумілий і інтуїтивно зрозумілий синтаксис для визначення маршрутів і обробки HTTP-запитів. Ви можете створювати маршрути для різних URL-адрес, методів HTTP і параметрів маршрутів.
-
Валідації: ActiveRecord надає вбудовані методи валідації для забезпечення цілісності даних. Ви можете перевіряти атрибути моделі, наприклад, наявність, унікальність, формат та інше.
-
Асоціації: ActiveRecord дозволяє визначати зв'язки між моделями, наприклад, "один до одного", "один до багатьох" та "багато до багатьох". Це полегшує роботу з пов'язаними даними і виконання запитів через асоціації.
Висновок
Комбінація Sinatra і ActiveRecord забезпечує потужну основу для створення веб-застосунків на Ruby. Простота та гнучкість Sinatra доповнюють можливості ActiveRecord у роботі з базою даних, що дозволяє вам зосередитися на написанні чистого та підтримуваного коду. У цьому дописі ми розглянули процес налаштування, визначення моделей, виконання операцій із базою даних, інтеграцію ActiveRecord з маршрутами Sinatra, а також коротко торкнулися додаткових можливостей. Озброївшись цими знаннями, ви зможете ефективно використовувати обидва фреймворки для створення надійних веб-застосунків.
Детальніше про Sinatra: http://sinatrarb.com/.
Детальніше про ActiveRecord: https://guides.rubyonrails.org/activerecordbasics.html
Перекладено з: Using Sinatra with ActiveRecord in Ruby: A Powerful Combination for Web Development