我有一个Vehicle模型,它与ansible -i ./my_lookup.py -m setup all
有一个has_one
关联。
我想选择QrCode
的特定列,而不是选择所有列并映射单个值
我尝试了以下代码。
qr_code
但这不是有效的查询
以下代码将具有所需的值。
vehicle = Vehicle.first
code = vehicle.qr_code.pluck(:value)
但是通过此代码构建的查询是
code = vehicle.qr_code.value
这很昂贵,因为它会选择所有列值,并且qr_codes表中的列很少存储大量数据。
以下是代码实现
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"]]
意外查询:
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"]]
答案 0 :(得分:0)
您可以使用以下查询来获取车辆的第一个记录,其中包含其二维码的值名称
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)
答案 1 :(得分:0)
拥有Vehicle
实例时:
QrCode.
where(codeable: vehicle).
pluck(:value).
first
只有vehicle_id
时:
Vehicle.
left_joins(:qr_code).
where(id: vehicle_id).
pluck('qr_codes.value').
first
答案 2 :(得分:0)
根据您的预期查询-
QrCode.where(codeable: Vehicle.first).pluck(:value).first
答案 3 :(得分:0)
这将在查询中仅选择值列。
Vehicle.joins(:qr_code).select("qr_codes.value").pluck(:value)
对于特定车辆:
Vehicle.where(id: 1).joins(:qr_code).select("qr_codes.value").pluck(:value)