Разница между этими двумя запросами при объединении и включает использование слияния

Итак, в основном я пробую что-то в консоли rails, и я обнаружил, что есть некоторые различия при запросах с соединениями и включениями. Я знаю разницу между ними, например, ленивую загрузку с использованием соединения и нетерпеливую загрузку с использованием include. Но приведенный ниже код, кажется, сбивает меня с толку, они разные и почему не объединяется работа с включениями.

Table1.joins(:table2).merge(Table2.where(field_of_table2: "value")

Table1.joins(:table2).where(:table2 => {field_of_table2: "value"})

Оба, кажется, дают мне одинаковый результат.

Table1.includes(:table2).merge(Table2.where(field_of_table2: "value")

Слияние, похоже, не работает с включениями, но,

Table1.includes(:table2).where(:table2 => {field_of_table2: "value")

работает, но снова генерирует сложный оператор sql.

Я новичок в этом, пожалуйста, помогите мне понять любые негативные последствия использования этих двух утверждений. Я буду рад опубликовать инструкцию sql, если потребуется.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объединить - Слияние в условиях из таблицы 2, если таблица 2 является ActiveRecord :: Relation. Возвращает массив, представляющий пересечение результирующих записей с таблицей 2, если таблица 2 является массивом.

Где - возвращает новое отношение, которое является результатом фильтрации текущего отношения в соответствии с условиями в аргументах.

Где в основном фильтрует текущее отношение по условию предоставления, но слияние возвращает общие строки другого отношения.

Например,

class Book < ActiveRecord::Base
  scope :available, where(:available => true)
end

class Author < ActiveRecord::Base
  has_many :books
  scope :with_available_books, joins(:books).merge(Book.available)
end


Author.with_available_books

Вышеупомянутое состояние возвращает все книги, включая доступные.

Какая разница между запросом, содержащим слияние, и запросом без слияния

Qile 13.04.2018 11:45

В приведенном выше примере, если вы запустите Author.with_available_books, в первом запросе он вернет все книги, а во втором он соберет книги, которые существуют в первом запросе и при наличии. без слияния вы получаете только список книг независимо от наличия.

Pardeep Saini 13.04.2018 11:51

вы не понимаете мой вопрос. Я знаю разницу между слиянием и местом, но почему слияние не работает с включениями? Включает ли загружать все в память перед завершением инструкции?

Qile 13.04.2018 12:33

когда вы используете include, он запускает два запроса для получения данных, таких как Author.includes(:books).where(name: 'abc'), это приводит к SELECT "authors".* FROM "authors" where name = 'abc' LIMIT $1 , а второй - SELECT "books".* FROM "books" WHERE "autor_id"."id" in (id return by first query). поэтому, чтобы получить книги первого автора, вам нужно запустить author.first.books, но когда вы используете объединения, все результаты возвращаются в одном запросе, например «выберите * из авторов, присоедините книги к books.author_id = developers.id, где авторы.name = 'abc'.

Pardeep Saini 13.04.2018 12:59

И слияние работает с аналогичными модельными записями. Но в случае включения у нас есть только авторская запись, а не книги.

Pardeep Saini 13.04.2018 13:00

о, теперь я понял. Спасибо

Qile 13.04.2018 13:47

Другие вопросы по теме