Використання Sinatra з ActiveRecord у Ruby: Потужне поєднання для веб-розробки

Вступ

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
  1. Доступ до пов'язаних записів: Після встановлення зв'язку "один до багатьох" можна отримати доступ до пов'язаних записів з обох сторін. Наприклад, щоб отримати всіх агентів, пов'язаних з конкретною властивістю, можна використовувати метод асоціації 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 пропонують багато додаткових можливостей, які покращують процес розробки. Ось кілька з них:

  1. Маршрутизація: Sinatra забезпечує зрозумілий і інтуїтивно зрозумілий синтаксис для визначення маршрутів і обробки HTTP-запитів. Ви можете створювати маршрути для різних URL-адрес, методів HTTP і параметрів маршрутів.

  2. Валідації: ActiveRecord надає вбудовані методи валідації для забезпечення цілісності даних. Ви можете перевіряти атрибути моделі, наприклад, наявність, унікальність, формат та інше.

  3. Асоціації: 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

Leave a Reply

Your email address will not be published. Required fields are marked *