Как вытащить значение столбца в имеет одну ассоциацию? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть модель транспортного средства, которая имеет has_one связь с QrCode.Я хочу выбрать конкретный столбец qr_code вместо того, чтобы выбирать все столбцы и отображать одно значение

Я пробовал следующий код.

vehicle = Vehicle.first 
code = vehicle.qr_code.pluck(:value)

Но это неверный запрос

Следующий код будет иметь желаемое значение.

code = vehicle.qr_code.value 

Но построение запроса по этому коду:

SELECT  "qr_codes".* FROM "qr_codes" WHERE "qr_codes"."codeable_id" = $1 AND "qr_codes"."codeable_type" = $2 LIMIT 1  [["codeable_id", 1], ["codeable_type", "Vehicle"]]

Это дорого, поскольку он выбирает все значения столбцов и в таблице qr_codes есть несколько столбцов, в которых хранятся огромные данные.

Ниже приведена реализация кода

class Vehicle < ActiveRecord::Base
  has_one :qr_code, as: :codeable
end

class QrCode < ActiveRecord::Base
  belongs_to :codeable, polymorphic: true
end



не ожидаемый запрос:

SELECT  "qr_codes".* FROM "qr_codes" WHERE "qr_codes"."codeable_id" = $1 AND "qr_codes"."codeable_type" = $2 LIMIT 1  [["codeable_id", 1], ["codeable_type", "Vehicle"]]

ожидаемый запрос:

SELECT  "qr_codes".value FROM "qr_codes" WHERE "qr_codes"."codeable_id" = $1 AND "qr_codes"."codeable_type" = $2 LIMIT 1  [["codeable_id", 1], ["codeable_type", "Vehicle"]]

Ответы [ 4 ]

0 голосов
/ 18 июня 2019

В этом запросе будет выбран только столбец значений.

Vehicle.joins(:qr_code).select("qr_codes.value").pluck(:value)

Для конкретного транспортного средства:

Vehicle.where(id: 1).joins(:qr_code).select("qr_codes.value").pluck(:value)
0 голосов
/ 18 июня 2019

Когда у вас есть Vehicle экземпляр:

QrCode.
  where(codeable: vehicle).
  pluck(:value).
  first

Если у вас есть только vehicle_id:

Vehicle.
  left_joins(:qr_code).
  where(id: vehicle_id).
  pluck('qr_codes.value').
  first
0 голосов
/ 18 июня 2019

Согласно вашему ожидаемому запросу -

QrCode.where(codeable: Vehicle.first).pluck(:value).first

0 голосов
/ 18 июня 2019

Вы можете использовать запрос, как показано ниже, для получения первой записи автомобиля с именем значения его кода qr

Vehicle
      .left_outer_joins(:qr_code)
      .select("vehicles.*, 
              (SELECT qr_codes.value from qr_codes WHERE vehicles.id = qr_codes.codeable_id) as value_name")
      .limit(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...