Я обнаружил следующий вид использования 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]]