Рассчитать новый столбец в запросе activerecord рельсов - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть существующий запрос, который возвращает более 100 000 записей.

dev_results = records.joins("INNER JOIN devices ON (devices.id = snapshots.type_id)")
  .joins("INNER JOIN assets ON (devices.asset_id = assets.id)")
  .joins("LEFT JOIN systems ON (assets.system_id = systems.id)")
  .pluck("devices.hostname, devices.ipaddress, systems.fismaid, assets.is_expired")

Модель устройства имеет область действия:

  scope :dhcp, -> {
joins("INNER JOIN dhcp_cidrs ON (devices.ipaddress <<= dhcp_cidrs.cidr)").where("devices.id NOT IN (?)", Device.reserved.select("devices.id"))

}

Как использоватьDevice.dhcp как подзапрос для вычисления нового столбца с именем «is_dhcp» = true, если devices.id находится в dhcp_ids (в ​​противном случае is_dhcp = false)

1 Ответ

0 голосов
/ 14 ноября 2018

pluck () поддерживает широкий спектр команд базы данных.Во многих СУБД вы можете использовать конструкцию IF-THEN-ELSE.В PostgresQL вы должны использовать конструкцию CASE-WHEN-THEN-ELSE-END.

Сначала вы можете использовать модель.scope для создания конструкции CASE следующим образом:

dhcp_device_ids = Device.dhcp.select('devices.id').to_sql
dhcp_calculation = "CASE WHEN (devices.id IN (#{dhcp_device_ids})) THEN TRUE ELSE FALSE END"

Далее вы можете использовать этот расчет в pluck ()

.pluck("devices.hostname, devices.ipaddress, systems.fismaid, assets.is_expired, #{dhcp_calculation}")
...