Ruby on Rails (Rails) — це потужний фреймворк для веб-застосунків, побудований на Ruby, який пропонує підхід "конвенція понад конфігурацію" та надає широкий набір методів запитів для взаємодії з базами даних і моделями. Нижче я надам всебічний список можливих запитів, які можна виконувати в Ruby on Rails, класифікованих за різними функціональними напрямками.
- Основні запити ActiveRecord
ActiveRecord — це ORM (Object-Relational Mapping) в Rails, яка дозволяє взаємодіяти з базами даних, використовуючи об'єкти Ruby.
a.
Основні операції запитів:
- Знайти запис за його ID:
User.find(1)
- Знайти запис за умовою:
User.find_by(name: 'John')
- Знайти всі записи:
User.all
- Знайти перший запис (відсортований за первинним ключем):
User.first
- Знайти останній запис (відсортований за первинним ключем):
User.last
- Знайти записи з умовами:
User.where(active: true)
- Знайти запис за умовою з лімітом:
User.where(active: true).limit(5)
- Знайти запис з певними полями (вибір стовпців):
User.select(:id, :name).where(active: true)
- Знайти перший запис за умовою:
User.find_by(name: 'John')
b.
Запити агрегації:
- Підрахувати записи:
User.count
- Підрахувати з умовами:
User.where(active: true).count
- Середнє значення стовпця:
User.average(:age)
- Максимальне значення стовпця:
User.maximum(:age)
- Мінімальне значення стовпця:
User.minimum(:age)
- Сума стовпця:
User.sum(:age)
c. Порядок і сортування:
- Сортувати за стовпцем:
User.order(:name)
- Сортувати за спаданням:
User.order(name: :desc)
- Сортувати за кількома стовпцями:
User.order(:age, name: :desc)
d. Групування та умови:
- Групувати за стовпцем:
User.group(:city).count
- Мати умову на згруповані записи:
User.group(:city).having('count(city) > 1').count
e.
Запити з'єднання (Join):**
- З'єднання з іншою таблицею (inner join):
User.joins(:posts).where(posts: { published: true })
- Ліве з'єднання (Left Join):
User.left_joins(:posts).where(posts: { published: true })
- З'єднання з вибіркою певних полів:
User.joins(:posts).select('users.name, posts.title').where(posts: { published: true })
f. Підзапити:
- Використання підзапиту:
User.where(id: Post.select(:user_id).where(active: true))
g. Distinct:
- Вибірка унікальних записів:
User.select(:city).distinct
2. Розширені запити ActiveRecord
a. Scopes (Області видимості):
- Визначення області видимості для моделі:
class User < ApplicationRecord
scope :active, -> { where(active: true) }
end
- Використання області видимості:
User.active
b. Eager Loading (для запобігання проблемі N+1 запитів):
- Виконання попереднього завантаження асоційованих записів:
User.includes(:posts).where(posts: { published: true })
c.
Пагінація (Pagination):**
- Використання
kaminari
абоwill_paginate
для пагінації:
User.page(1).per(10) # Kaminari
User.paginate(page: 1, per_page: 10) # will_paginate
3. Запити для маніпуляцій з базою даних
a. Створення або вставка записів:
- Створення нового запису:
User.create(name: 'John', age: 30)
- Створення нового запису з валідаціями:
user = User.new(name: 'John', age: 30)
user.save
b. Оновлення записів:
- Оновлення запису за ID:
user = User.find(1)
user.update(name: 'Riyad')
- Оновлення кількох записів:
User.where(active: false).update_all(active: true)
c. Видалення або знищення записів:
- Знищення одного запису (викликає колбеки):
user.destroy
- Видалення записів (не викликає колбеків):
User.where(active: false).delete_all
d.
Запити в транзакціях (Transaction Queries):**
- Виконання операцій в межах транзакції:
ActiveRecord::Base.transaction do
user = User.create!(name: 'John')
post = Post.create!(user_id: user.id, title: 'My Post')
end
4. Запити для схеми бази даних та міграцій
- Створення нової міграції:
rails g migration AddAgeToUsers age:integer
- Виконання міграцій:
rake db:migrate
- Откат останньої міграції:
rake db:rollback
- Створення або зміна індексів в базі даних:
add_index :users, :name
5. Робота з асоціаціями
ActiveRecord підтримує кілька типів асоціацій.
a. Belongs To та Has Many:
- Belongs to:
class Post < ApplicationRecord
belongs_to :user
end
- Has Many:
class User < ApplicationRecord
has_many :posts
end
b. Has One:
- Has One:
class User < ApplicationRecord
has_one :profile
end
c.
Багато до багатьох (Has and Belongs to Many):**
- Has and Belongs to Many:
class User < ApplicationRecord
has_and_belongs_to_many :groups
end
d. Вкладені атрибути:
- Приймає вкладені атрибути для пов'язаного моделі:
class User < ApplicationRecord
has_many :posts
accepts_nested_attributes_for :posts
end
6. Користувацькі запити
a. Сирі SQL запити:
- Виконання сирого SQL запиту:
User.find_by_sql("SELECT * FROM users WHERE active = true")
b. SQL фрагменти:
- Використання SQL фрагментів для користувацьких умов:
User.where("age > ?", 30)
7. Функції бази даних та розширені можливості
a. Пошук за допомогою повнотекстового пошуку:
- Використовуйте гем
pg_search
абоsearchkick
для реалізації повнотекстового пошуку.
b.
Функції бази даних:
- Використання специфічних для бази даних функцій (наприклад,
lower
,concat
):
User.where("LOWER(name) = ?", 'john')
Висновок:
Ruby on Rails надає дуже гнучкий та потужний інтерфейс запитів через ActiveRecord та SQL, що дозволяє виконувати все — від простих операцій CRUD до складних з'єднань, агрегацій і навіть повнотекстового пошуку. Ключ до освоєння запитів в Rails — це розуміння можливостей ActiveRecord, ефективна робота з асоціаціями та використання потужності сирого SQL, коли це необхідно для складних операцій.
Перекладено з: All possible queries that can be done using Ruby on Rails