1
考慮這個設置Rails的計數的has_many關係和組另一場在一個子模型
class Device
has_many :job_transactions
end
class JobTransaction
belongs_to :device
# relevant attributes
# sequential_id (each transaction gets a sequential if using Sequenced Gem)
# station - work station (let say a total of 10)
# station is an enum
end
每個職業都有多種交易和每次交易完成工作後,從一個站到另一個移動(它們可以被多次移動到不同的甚至相同的交易)
我想知道有多少工作(單位)在這個時刻在每個站點使用最高順序ID。
所以結果應該是
{
"Station 1" => 500,
"Station 2" => 123,
etc..
}
我的問題是確保我只爲每個設備計數的最新交易,而不是1或其它一些。因爲我需要弄清楚目前每個工作站有多少臺設備。
UPDATE:
基本上我想優化這個骯髒的一段代碼:
has_one :latest_transaction, -> { order sequential_id: :desc },
class_name: 'JobTransaction',
foreign_key: 'job_id'
h = Device.joins(:job_transactions).
map{|l| l.latest_transaction.station}.
reduce(Hash.new(0)) { |a, b| a[b] += 1; a };
更新2
這裏是一個更快的解決方案,但我還在找對於SQL解決方案
JobTransaction.select('job_id, station, sequential_id').
group_by(&:job_id).
reduce(Hash.new(0)) { |a, b| a[b.last.last.station] += 1; a }
嗨。每個設備有幾個job_transactions:1,3,7等,當我分組時 - 我只想使用最新的(最後的,具有最高的sequential_id)事務進行分組。默認情況下,mysql會抓取第一條不符合最後條件的記錄(這也是您的建議) - 所以當我分組時 - 我在第一個事務中只保留站點,而不是最後一個(最近的,目前如果你願意) - 參見我的更新2 - 本質上試圖找出如何在SQL中實現該group_by&reduce – konung