2015-11-04 37 views
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 } 

回答

0

難道你不能想:

#app/models/device.rb 
class Device < ActiveRecord::Base 
    has_many :job_transactions 
    scope :count_transactions, -> { joins(:job_transacations).group(:job_id).count } 
end 

我沒有得到這個要求:

如果你澄清我只爲每個設備計數最新交易

也許,我們可以得到一些東西嗎?

+0

嗨。每個設備有幾個job_transactions:1,3,7等,當我分組時 - 我只想使用最新的(最後的,具有最高的sequential_id)事務進行分組。默認情況下,mysql會抓取第一條不符合最後條件的記錄(這也是您的建議) - 所以當我分組時 - 我在第一個事務中只保留站點,而不是最後一個(最近的,目前如果你願意) - 參見我的更新2 - 本質上試圖找出如何在SQL中實現該group_by&reduce – konung

相關問題