我有一個簡單的 Rails 應用程式。我正在嘗試計算服務模型中儀器的每個使用時間。如何在服務模型中計算它?
class Service < ApplicationRecord
has_many :instruments
def total_usage
# I want to sum the usage arrays which is from the Instrument model.
# Here
end
end
class Instrument < ApplicationRecord
belongs_to :service, dependent: :destroy
def usage
outtime = self.out_time
intime = self.in_time
usage = ((outtime - intime)/60.0).round.abs
end
end
uj5u.com熱心網友回復:
在 DB 中進行簡單的聚合和計算幾乎總是更可取的,以便您可以使用它們對記錄進行排序:
# Postgres
Service.group(:id)
.select(
'services.*',
'SUM(instruments.time_diff) AS usage'
).joins(
'LATERAL (
SELECT instruments.out_time - instruments.in_time AS time_diff
FROM instruments
WHERE instruments.service_id = services.id
) instruments'
)
# MySql
Service.group(:id)
.select(
'services.*',
'SUM(
SELECT DATEDIFF(instruments.out_time, instruments.in_time)
FROM instruments
WHERE instruments.service_id = services.id
) AS usage'
)
如果您只需要聚合而不是整個記錄,這也可以避免加載和實體化所有相關記錄。
uj5u.com熱心網友回復:
def total_usage
# or instruments.sum(&:usage) for short
instruments.sum { |instrument| instrument.usage }
end
順便說一句,dependent: :destroy應該放在has_many
has_many :instruments, dependent: :destroy
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/380422.html
