Ответ не был принят, поэтому я постараюсь ответить на ваши вопросы так, как я их понимаю:
- «откуда он знает все поля, доступные в таблице?»
Выполняет SQL-запрос для каждого класса, который наследуется от ActiveRecord :: Base. Если класс «Собака», он выполнит запрос, чтобы найти имена столбцов таблицы «собаки». В производственном режиме он должен делать этот запрос только один раз за запуск сервера - в режиме разработки он делает это много. Запрос будет отличаться в зависимости от базы данных, которую вы используете, и обычно это дорогой запрос.
- «Скажите, если у меня есть одно и то же имя для столбца в таблице и в связанной таблице, как это разрешает это?»
Если вы делаете соединение, оно генерирует sql, используя имена таблиц в качестве префиксов, чтобы избежать двусмысленности. Фактически, если вы выполняете объединение в Rails и хотите добавить условие (используя пользовательский SQL) для имени, но и основная таблица, и таблица объединения имеют столбец имени, вам необходимо указать имя таблицы в вашем sql. (например, Human.join (: домашние животные) .where ("humans.name = 'John'"))
- «Я имею в виду, активная ли загрузка отношения has-many запускает 2 запроса или один запрос на соединение?»
Разные версии Rails разные. Я думаю , что ранние версии всегда выполняли один запрос на соединение. В более поздних версиях иногда выполняются несколько запросов, а иногда - один запрос на соединение, исходя из понимания того, что один запрос на объединение не всегда так эффективен, как несколько запросов. Я не уверен в точной логике, которую он использует, чтобы решить. Недавно в Rails 3 я видел несколько запросов, происходящих в моей текущей кодовой базе, но, возможно, иногда это также приводит к объединению, я не уверен.