Я работаю над изучением Ruby on Rails и задаю некоторые конкретные вопросы об активных рельсах и их преобразованиях SQL.В чем разница между выбором пользователей. * И выбором каждого столбца?
FYI, я использую PostgreSQL и пользователя модели имеет много статусов, и я хотел бы заказать пользователей на основе created_at колонка состояний. Хотя я нашел решение, User.includes(:statuses).order('statuses.created_at desc')
, у меня все еще есть некоторые (возможно, связанные между собой) вещи, которые я плохо понимаю.
1) На рельсах консоли, (я упрощены для лучшего readibility)
User.joins(:statuses).to_sql
производит "SELECT users.* FROM users INNER JOIN statuses ON statuses.user_id = users.id"
.
User.includes(:statuses).references(:statuses).to_sql
производит "SELECT users.id AS t0_r0, ...(simplified)... statuses.created_at AS t1_r3 FROM users LEFT OUTER JOIN statuses ON statuses.user_id = users.id"
Какова разница между выбором пользователей. * И выбор каждого отдельного столбца?
2) Кроме того, на рельсы консоли
User.joins(:statuses).size
производит SELECT COUNT(*) FROM users INNER JOIN statuses ON statuses.user_id = users.id => 155
.
User.includes(:statuses).references(:statuses).size
производит SELECT COUNT(DISTINCT users.id) FROM users LEFT OUTER JOIN statuses ON statuses.user_id = users.id => 16
.
Почему включает автоматически содержит отчетливое положение в то время как присоединяется не?
3) Я попытался получить отчетливый пользователей по заказу statuses.created_at с статусами соединяемых на пользователей.
Я использовал этот раздел: User.joins(:statuses).select('users.*, statuses.created_at').order('statuses.created_at desc').distinct
. (Я должен использовать . Status status.created_at из-за PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
)
Но этот пункт не удаляет дублирование! Хотя User.joins(:statuses).select!('users.*, statuses.created_at').order('statuses.created_at desc').distinct.size
производит , когда я его фактически выполняю, я вижу много дубликатов.
Он выдает инструкцию SQL: SELECT DISTINCT users.*, statuses.created_at FROM users INNER JOIN statuses ON statuses.user_id = users.id ORDER BY statuses.created_at desc
, и он показывает следующее изображение.
Как вы видите, это показывает дупликации моих записей.
Итак, мой третий вопрос: Почему отдельная статья не устраняет дублирования (и почему размер показывает отличный результат)?
Заранее спасибо!