如何在一个关联中提取一个列值?

时间:2019-06-18 06:18:36

标签: ruby-on-rails ruby activerecord associations

我有一个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"]]

4 个答案:

答案 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)