Усі можливі запити, які можна виконати за допомогою Ruby on Rails

Ruby on Rails (Rails) — це потужний фреймворк для веб-застосунків, побудований на Ruby, який пропонує підхід "конвенція понад конфігурацію" та надає широкий набір методів запитів для взаємодії з базами даних і моделями. Нижче я надам всебічний список можливих запитів, які можна виконувати в Ruby on Rails, класифікованих за різними функціональними напрямками.

  1. Основні запити 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

Leave a Reply

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