Почему ActiveRecord find_by возвращает nil при использовании его вместе с select? - PullRequest
1 голос
/ 18 октября 2019

Я обнаружил следующий вид использования ActiveRecord # find_by, написанный в проекте Rails 4.1:

booking = Booking.find_by(member_id: Member.where(id: 1).select(:id))

Однако этот запрос вернул ноль после обновления проекта до Rails> 4.2.

В Rails 4.2 вышеупомянутый запрос генерирует следующий SQL:

SELECT "bookings".* FROM "bookings" WHERE "bookings"."member_id" = $1 LIMIT 1 [["member_id", nil]]

«Бронирование» принадлежит «Участнику», а «Участник» имеет много«Бронирование».

Кто-нибудь знает или видит почему? Мне было бы интересно получить объяснение.

Замена выбора с помощью pluck возвращает ожидаемое поведение:

booking = Booking.find_by(member_id: Member.where(id: 1).pluck(:id))

Сгенерированный запрос: SELECT "bookings".* FROM "bookings" WHERE "bookings"."member_id" = 1 LIMIT 1

Редактировать: в базе данных существует запись участника с идентификатором 1.

Member.where(id: 1).select(:id) возвращает следующий результат и оператор SQL с Rails 4.2:

=> #<ActiveRecord::Relation [#<Member id: 1>]>

SELECT "members"."id" FROM "members" WHERE "members"."id" = $1 [["id", 1]]

1 Ответ

0 голосов
/ 18 октября 2019
...