Стремится ли загрузка так же, как и к соединению? - PullRequest
3 голосов
/ 16 марта 2011

Является ли стремление получить то же самое, что и соединение?

Я имею в виду, активная ли загрузка отношения has-many запускает 2 запроса или один запрос на соединение?

Как активная запись rails реализует выборку объединений, поскольку она не знает метаданные таблицы из первых рук (я имею в виду столбцы в таблице)? Скажем, например, у меня есть

человек - идентификатор, имя вещи - id, person_id, имя

человек имеет отношение «один ко многим» с вещами. Так как же он генерирует запрос со всеми псевдонимами столбцов, даже если он не может знать об этом, когда я выполняю объединение для людей?

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

Ответ не был принят, поэтому я постараюсь ответить на ваши вопросы так, как я их понимаю:

  • «откуда он знает все поля, доступные в таблице?»

Выполняет SQL-запрос для каждого класса, который наследуется от ActiveRecord :: Base. Если класс «Собака», он выполнит запрос, чтобы найти имена столбцов таблицы «собаки». В производственном режиме он должен делать этот запрос только один раз за запуск сервера - в режиме разработки он делает это много. Запрос будет отличаться в зависимости от базы данных, которую вы используете, и обычно это дорогой запрос.

  • «Скажите, если у меня есть одно и то же имя для столбца в таблице и в связанной таблице, как это разрешает это?»

Если вы делаете соединение, оно генерирует sql, используя имена таблиц в качестве префиксов, чтобы избежать двусмысленности. Фактически, если вы выполняете объединение в Rails и хотите добавить условие (используя пользовательский SQL) для имени, но и основная таблица, и таблица объединения имеют столбец имени, вам необходимо указать имя таблицы в вашем sql. (например, Human.join (: домашние животные) .where ("humans.name = 'John'"))

  • «Я имею в виду, активная ли загрузка отношения has-many запускает 2 запроса или один запрос на соединение?»

Разные версии Rails разные. Я думаю , что ранние версии всегда выполняли один запрос на соединение. В более поздних версиях иногда выполняются несколько запросов, а иногда - один запрос на соединение, исходя из понимания того, что один запрос на объединение не всегда так эффективен, как несколько запросов. Я не уверен в точной логике, которую он использует, чтобы решить. Недавно в Rails 3 я видел несколько запросов, происходящих в моей текущей кодовой базе, но, возможно, иногда это также приводит к объединению, я не уверен.

1 голос
/ 16 марта 2011

Он знает столбцы через тип отражения.Ruby очень гибок и позволяет создавать функциональность, которая будет использоваться / определяться во время выполнения, и не требует предварительного указания.Он изучает связанный столбец «person_id», интерпретируя «own_to: person» и зная, что «person_id» - это поле, которое будет связано, и таблица будет называться «people».

Если вы делаете People.включает в себя (: вещи), тогда он сгенерирует 2 запроса: 1, который получает людей, и второй, который получает вещи, которые имеют отношение к людям, которые существуют.

http://guides.rubyonrails.org/active_record_querying.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...