我有一个与QrCode有has_one关联的车辆模型。我希望提取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"]]发布于 2019-06-18 14:26:05
您可以使用如下查询来获取车辆首条记录及其二维码的值名称
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)发布于 2019-06-18 14:32:22
如果您有Vehicle实例:
QrCode.
where(codeable: vehicle).
pluck(:value).
first当您仅使用vehicle_id时:
Vehicle.
left_joins(:qr_code).
where(id: vehicle_id).
pluck('qr_codes.value').
first发布于 2019-06-18 15:12:05
根据您预期的查询-
QrCode.where(codeable: Vehicle.first).pluck(:value).first
https://stackoverflow.com/questions/56642783
复制相似问题