Итак, в основном я пробую что-то в консоли 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, если потребуется.






Объединить - Слияние в условиях из таблицы 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
Вышеупомянутое состояние возвращает все книги, включая доступные.
В приведенном выше примере, если вы запустите Author.with_available_books, в первом запросе он вернет все книги, а во втором он соберет книги, которые существуют в первом запросе и при наличии. без слияния вы получаете только список книг независимо от наличия.
вы не понимаете мой вопрос. Я знаю разницу между слиянием и местом, но почему слияние не работает с включениями? Включает ли загружать все в память перед завершением инструкции?
когда вы используете 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'.
И слияние работает с аналогичными модельными записями. Но в случае включения у нас есть только авторская запись, а не книги.
о, теперь я понял. Спасибо
Какая разница между запросом, содержащим слияние, и запросом без слияния